socket简介
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。
代码解释
Socket编程可以使用 TCP协议,也可以使用UDP协议,我这里使用的是TCP协议的代码,运行的时候先运行服务器端,再运行客户端。
服务端
package org.somken.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
/**
* 服务器端
*author 周谦
*/
public class SocketSServer {
public static void main(String[] args) throws IOException {
System.out.println("服务器开始运行...\n");
//创建侦听传入连接的服务器套接字
//端口10000上的请求。
ServerSocket server = new ServerSocket(10000);
while (true) {
//侦听来自客户端的传入连接请求
//programs,建立连接,返回socket
//表示此连接的对象。
Socket s = server.accept();
System.out.println("接受连接中...\n");
//启动一个线程来处理连接。
new ServerThread(s).start();
}
}
}
class ServerThread extends Thread {
private Socket s;
ServerThread(Socket s) {
this.s = s;
}
public void run() {
BufferedReader br = null;
PrintWriter pw = null;
try {
//创建一个链接到套接字的输入流读取器
//面向字节的输入流。输入流读取器
//将从套接字读取的字节转换为字符。这个
//转换基于平台的默认字符
//设置。
InputStreamReader isr;
isr = new InputStreamReader(s.getInputStream());
//创建一个链接到输入流的缓冲读取器
br = new BufferedReader(isr);
/*创建一个链接到套接字面向字节的输出流的打印写入程序。打印作者创建
将发送到套接字的字符转换为字节的中间输出流编写器。转换
基于平台的默认字符集。
*/
pw = new PrintWriter(s.getOutputStream(), true);
//创建可以获取日期和时间信息的日历。
Calendar c = Calendar.getInstance();
do {
//获取客户端程序的下一个命令。
String cmd = br.readLine();
// 如果客户端程序已关闭其输出流,则退出。
if (cmd == null)
break;
//将命令转换为大写,以便于比较。
cmd = cmd.toUpperCase();
// 如果客户端程序发送bye命令,则终止。
if (cmd.startsWith("BYE"))
break;
// 如果客户端程序发送日期或时间命令,则将当前日期/时间返回给客户端程序。
if (cmd.startsWith("DATE") || cmd.startsWith("TIME"))
pw.println(c.getTime().toString());
//如果客户端程序发送dom(月日)命令,则将当前月日返回给客户端程序。
if (cmd.startsWith("DOM"))
pw.println("" + c.get(Calendar.DAY_OF_MONTH));
// 如果客户端程序发送dow(星期几)命令,
//则将当前工作日(作为字符串)返回给客户端程序。
if (cmd.startsWith("DOW"))
switch (c.get(Calendar.DAY_OF_WEEK)) {
case Calendar.SUNDAY:
pw.println("SUNDAY");
break;
case Calendar.MONDAY:
pw.println("MONDAY");
break;
case Calendar.TUESDAY:
pw.println("TUESDAY");
break;
case Calendar.WEDNESDAY:
pw.println("WEDNESDAY");
break;
case Calendar.THURSDAY:
pw.println("THURSDAY");
break;
case Calendar.FRIDAY:
pw.println("FRIDAY");
break;
case Calendar.SATURDAY:
pw.println("SATURDAY");
}
// 如果客户端程序发送doy(一年中的某一天)命令,则将当前的一年中的某一天返回给客户端程序
if (cmd.startsWith("DOY"))
pw.println("" + c.get(Calendar.DAY_OF_YEAR));
// 如果客户端程序发送暂停命令,则睡眠3秒钟。
if (cmd.startsWith("PAUSE"))
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
} while (true);
} catch (IOException e) {
System.out.println(e.toString());
} finally {
System.out.println("关闭连接...\n");
try {
if (br != null)
br.close();
if (pw != null)
pw.close();
if (s != null)
s.close();
} catch (IOException e) {
}
}
}
}
客户端代码
package org.somken.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
author 周谦
*/
public class SocketSClient {
public static void main(String[] args) {
String host = "localhost";
// 如果用户指定命令行参数,则该参数表示主机名。
if (args.length == 1)
host = args[0];
BufferedReader br = null;
PrintWriter pw = null;
Socket s = null;
try {
//创建一个套接字,尝试连接到位于端口10000的主机上的服务器程序。
s = new Socket(host, 10000);
InputStreamReader isr;
isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);
pw = new PrintWriter(s.getOutputStream(), true);
// 向服务器发送日期命令。
pw.println("DATE");
// 获取并打印当前日期/时间。
System.out.println(br.readLine());
// 向服务器发送暂停命令。这允许多个客户端启动并验证服务器是否正在生成多个线程。
pw.println("PAUSE");
// 向服务器发送dow命令。
pw.println("DOW");
// 获取并打印当前星期几。
System.out.println(br.readLine());
// 将dom命令发送到服务器。
pw.println("DOM");
// 获取并打印当前月份的日期。
System.out.println(br.readLine());
// 将doy命令发送到服务器。
pw.println("DOY");
// 获取并打印当前日期。
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println(e.toString());
} finally {
try {
if (br != null)
br.close();
if (pw != null)
pw.close();
if (s != null)
s.close();
} catch (IOException e) {
}
}
}
}
文章评论