从上篇文章我们已经对Socket有了初步的认识,现在我们就通过一个例子来实现。
1.服务端
通信,首先需要的就是服务端,如果没有服务端,我们和谁通信?通过以下代码我们来创建一个服务端
ServerSocket server = null;
System.out.println("应用启动.....");
try {
server = new ServerSocket(7456);//绑定本地的端口号
while (true) {//循环,可以多次建立连接
Socket connection = null;
try {
// 接收一个连接,在没有客户端访问的时候,accept会一直阻塞
connection = server.accept();
// 获取连接的客户端的地址
System.out.println("一个连接建立" + connection.getInetAddress());
// 从连接中获取输出流
Writer out = new OutputStreamWriter(connection.getOutputStream());
Date date = new Date();
out.write(date.toString() + "\r\n");
// 输出流都会有一个缓冲区,比如有一个1024字节的缓冲区
// 如果缓冲区中的数据量不足1024,那么就会等待,而不会将数据发送给客户端
// 使用flush()则将缓冲区中的数据强制发送
out.flush();
connection.close();
} finally {
// 必须手动关闭掉
if (connection != null)
connection.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (server != null)
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.客户端
Socket socket = null;
try {
// 连接地址和端口号,地址用于找到主机,端口号用于找到对应应用
socket = new Socket("localhost", 7456);
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
int c;
while ((c = reader.read()) != -1) {
System.out.print((char) c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3.连接和使用
首先运行服务端代码,效果如下:
应用启动.....
再启动客户端,服务端控制台如下:
应用启动.....
一个连接建立/127.0.0.1
回到客户端控制台,内容如下:
Fri May 20 14:41:31 CST 2016