对于java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket,服务端客户端通过Socket建立连接就可以通信了。首先,ServerSocket在服务器监听某端口,当发现客户端有某Socket试图连接ServerSocket时,它会accept该请求,同时在服务端建立一个Socket与之通信,这样客户端和服务端各有一个Socket。
Socket之间通信其实就是客户端往Socket的输出流写内容,服务端就可以从输出流里读取对应内容。而且Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。不多说,上例子:
服务端:
public class Server {
public static void main(String args[]) throws IOException {
int port = 8090;
//定义一个ServerSocket监听在端口8090上
ServerSocket server = new ServerSocket(port);
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的,服务端没接收到客户端发送的信息,就会一直监听,除非关闭输出流
Socket socket = server.accept();
//获取socket的InputStream,并从中读取客户端发过来的信息了。
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[64];
int len;
StringBuilder sb = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
sb.append(new String(chars, 0, len));
}
System.out.println("from client: " + sb);
reader.close();
socket.close();
server.close();
}
}
客户端:
public class Client {
public static void main(String args[]) throws Exception {
String host = "127.0.0.1"; // 要连接的服务端IP地址
int port = 8090; // 要连接的服务端对应的监听端口
// 与服务端建立连接
Socket client = new Socket(host, port);
// 建立连接后就可以往服务端写数据了
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("我是中国人,我爱自己的祖国");
writer.flush();// 写完后要记得flush
writer.close();
client.close();
}
}
服务启动后,客户端运行服务端console窗口便会打印客户端发送的消息:
from client: 我是中国人!