java socket 套接字通信
来源:互联网 发布:数据分析师怎么样 编辑:程序博客网 时间:2024/05/17 08:30
对于这种服务端或客户端接收中文乱码的情况通常是因为数据发送时使用的编码跟接收时候使用的编码不一致。比如有下面这样一段服务端代码:
Java代码
- public class Server {
- public static void main(String args[]) throws IOException {
- //为了简单起见,所有的异常信息都往外抛
- int port = 8899;
- //定义一个ServerSocket监听在端口8899上
- ServerSocket server = new ServerSocket(port);
- while (true) {
- //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
- Socket socket = server.accept();
- //每接收到一个Socket就建立一个新的线程来处理它
- new Thread(new Task(socket)).start();
- }
- }
- /**
- * 用来处理Socket请求的
- */
- static class Task implements Runnable {
- private Socket socket;
- public Task(Socket socket) {
- this.socket = socket;
- }
- public void run() {
- try {
- handleSocket();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 跟客户端Socket进行通信
- * @throws Exception
- */
- private void handleSocket() throws Exception {
- BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "GBK"));
- StringBuilder sb = new StringBuilder();
- String temp;
- int index;
- while ((temp=br.readLine()) != null) {
- System.out.println(temp);
- if ((index = temp.indexOf("eof")) != -1) {//遇到eof时就结束接收
- sb.append(temp.substring(0, index));
- break;
- }
- sb.append(temp);
- }
- System.out.println("客户端: " + sb);
- //读完后写一句
- Writer writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
- writer.write("你好,客户端。");
- writer.write("eof\n");
- writer.flush();
- writer.close();
- br.close();
- socket.close();
- }
- }
- }
这里用来测试我就弄的混乱了一点。在上面服务端代码中我们在定义输入流的时候明确定义了使用GBK编码来读取数据,而在定义输出流的时候明确指定了将使用UTF-8编码来发送数据。如果客户端上送数据的时候不以GBK编码来发送的话服务端接收的数据就很有可能会乱码;同样如果客户端接收数据的时候不以服务端发送数据的编码,即UTF-8编码来接收数据的话也极有可能会出现数据乱码的情况。所以,对于上述服务端代码,为使我们的程序能够读取对方发送过来的数据,而不出现乱码情况,我们的客户端应该是这样的:
Java代码
- public class Client {
- public static void main(String args[]) throws Exception {
- //为了简单起见,所有的异常都直接往外抛
- String host = "127.0.0.1"; //要连接的服务端IP地址
- int port = 8899; //要连接的服务端对应的监听端口
- //与服务端建立连接
- Socket client = new Socket(host, port);
- //建立连接后就可以往服务端写数据了
- Writer writer = new OutputStreamWriter(client.getOutputStream(), "GBK");
- writer.write("你好,服务端。");
- writer.write("eof\n");
- writer.flush();
- //写完以后进行读操作
- BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
- //设置超时间为10秒
- client.setSoTimeout(10*1000);
- StringBuffer sb = new StringBuffer();
- String temp;
- int index;
- try {
- while ((temp=br.readLine()) != null) {
- if ((index = temp.indexOf("eof")) != -1) {
- sb.append(temp.substring(0, index));
- break;
- }
- sb.append(temp);
- }
- } catch (SocketTimeoutException e) {
- System.out.println("数据读取超时。");
- }
- System.out.println("服务端: " + sb);
- writer.close();
- br.close();
- client.close();
- }
- }
0 0
- java通信&套接字Socket
- java socket 套接字通信
- socket--套接字通信
- 利用Socket套接字通信
- Socket套接字通信原理
- Socket套接字通信原理
- Socket(套接字)通信笔记
- socket套接字通信及socketserver通信
- Java 套接字(Socket)
- Java套接字(Socket)
- Java 套接字(Socket)
- Java 套接字(Socket)
- Java Socket套接字
- Java--Socket套接字
- Java 套接字Socket
- linux进程间通信--socket套接字
- linux进程间通信--socket套接字
- linux进程间通信--socket套接字
- 登录页面
- mybatis在xml文件中处理大于号小于号的方法
- RuntimeException: Package manager has died
- 每天技术总结 10.20 ssm框架 配置
- 青头小白之pycharm+diango
- java socket 套接字通信
- CodeForces 91B Queue【线段树】
- SVN本地服务器,SVN客户端使用详解
- IOS跳转APPstore和评价页面
- SQLite数据库之数据添加与删除
- PHP扩展迁移-注意事项
- hdu 2955 Robberies (0-1背包)
- 简单的二维码扫描
- 既点击改