Socket编程入门:一对一交互
2016-03-30 15:54
387 查看
package com.tang.nio.server; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 服务器端 * @author tang * @date 2016-03-30 */ public class SocketServer { public static void main(String[] args) throws IOException{ // 创建服务器套接字,监听9999端口 ServerSocket serverSocket = new ServerSocket(9999); // 接收客户端连接请求,在没有客户端访问之前,一直处于阻塞状态 Socket socket = serverSocket.accept(); System.out.println("接收到客户端连接请求"); // 构造Reader及Writer,分别用于读取客户端消息、向客户端发送消息 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); while (true) { // 循环处理消息,接收客户端消息 // 使用readLine需注意,消息应以'\n'结尾,否则网络连接会一直处于阻塞状态 String message = bufferedReader.readLine(); System.out.println("接收到客户端消息:" + message); if("exit".equals(message)){ // 客户端发出exit消息,表示意图结束连接,此时跳出循环,结束连接 printWriter.write("已断开与服务器端连接\n"); printWriter.flush(); break; } else { // 响应客户端消息,以'\n'结尾,方便客户端readLine接收 printWriter.write(message + "\n"); printWriter.flush(); } } // 关闭套接字 socket.close(); } }
package com.tang.nio.client; import java.io.*; import java.net.Socket; /** * 客户端 * @author tang * @date 2016-03-30 */ public class SocketClient { public static void main(String[] args) throws IOException{ // 创建指向localhost主机9999端口的套接字 Socket socket = new Socket("localhost", 9999); // 构造Reader及Writer,分别用于读取服务器端消息、向服务器端发送消息 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); // 构造控制台Reader,获取用户输入的消息 BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); while (true) { // 接收用户控制台输入的消息 System.out.print("请输入发送到服务器的消息:"); String line = consoleReader.readLine(); // 将用户输入的消息发送到服务器端,以'\n'结尾 printWriter.write(line + "\n"); printWriter.flush(); // 获取服务器端响应的消息 String message = bufferedReader.readLine(); System.out.println("From Server:" + message); // 如果发送到服务器端的消息为exit,跳出循环,结束连接 if("exit".equals(line)){ break; } } // 关闭套接字 socket.close(); } }
上面的代码实现了服务器端和客户端的消息传递及响应。首先启动服务器端,再启动客户端。客户端会提示输入要发送到服务器端的消息,在控制台输入文本后回车,服务器端就会接收到用户在控制台输入的消息,并处理后返回给客户端查看,这样一次客户端/服务器端的通信就完成了。如果客户端输入的消息为exit,那么客户端和服务器端就会断开套接字连接,终止通信。执行结果:
实现这个Demo有一个较为麻烦的问题,就是当Reader调用readLine方法接收读取数据时,因为是网络套接字通信,找不到输入终止符,这个方法总是会处于阻塞状态。解决办法就是在输入的消息后面加上字符'\n',它就像我们在控制台输入文本后回车一个道理,表示消息到此结束,可以处理了。
相关文章推荐
- pyqt中信号,槽的使用方法
- spring+hibernate+jpa+Druid的配置文件,spring整合Druid
- Java线程安全
- Django REST 异常处理
- java多线程-使用ReadWriteLock同步数据访问
- 如何在.Net的C#中制作DLL文件
- 整型数据在内存中如何存储?
- python备忘录
- Java基础------知识点整理(九)-----异常
- php 中关于AES 的使用 ,被友盟搞死了
- eclipse 设置 build 的时候过滤 js
- yaml在python上的应用
- spring+dubbo整合
- 反编译 Eclipse 中的class文件
- (OK) 在Android系统上运行C/C++程序
- 阿里云ubuntu环境搭建java-web环境
- Raspberry Pi 整点报时
- C# 委托和事件 实现窗体间的通信
- 利用phpmyadmin修改mysql的root密码及如何进入修改密码后的phpmyadmin
- 使用delphi+intraweb进行微信开发5—准备实现微信API,先从获取AccessToken开始