socket双向通信,为什么服务器只能接收一次客户端发送的消息

问题描述

如题,双向的socket通信,但是服务端只能接收一次客户端发送的请求消息就终止在accept状态,请问是哪里出了问题了。客户端程序如下:package com.snail.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;public class SocketClient {public static void main(String[] args) {Socket socket = null;PrintWriter printWriter = null;BufferedReader bufferedReader = null;try {socket = new Socket(InetAddress.getLocalHost(), 2123);bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));printWriter = new PrintWriter(socket.getOutputStream(), true);int i=1;while (true) {System.out.println("input " + i);BufferedReader bufIn = new BufferedReader(new InputStreamReader(System.in));String result = bufIn.readLine();System.out.println("client input data " + i++ + ": " + result);printWriter.println(result);printWriter.flush();String serverStr = bufferedReader.readLine();System.out.println("Server : " + serverStr);// 在标准输出上打印从Server读入的字符串if (result.equals("end")) {bufIn.close();break;}}printWriter.close();bufferedReader.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(socket != null) {try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(printWriter != null) {printWriter.close();}if(bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}服务端代码如下:package com.snail.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class SocketServer {public static void main(String[] args) {ServerSocket serverSocket = null;Socket socket = null;BufferedReader bufferedReader = null;PrintWriter printWriter = null;try {serverSocket = new ServerSocket(2123);int i = 1;while (true) {System.out.println("accept " + i);socket = serverSocket.accept();System.out.println("begin " + i++ + ": " + "accept");bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));printWriter = new PrintWriter(socket.getOutputStream(), true);// 获取从客户端读入的字符串String result = bufferedReader.readLine();System.out.println("Client say : " + result);if ("bye".equals(result)) {System.out.println("Client say : " + result);printWriter = new PrintWriter(socket.getOutputStream());printWriter.print("hello Client, I am Server! bye-bye.");printWriter.flush();break;}// 由Socket对象得到输出流,并构造PrintWriter对象printWriter.println("hello Client, I am Server!");printWriter.flush();}printWriter.close();bufferedReader.close();socket.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();} finally {if (socket != null) {try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (serverSocket != null) {try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}if (printWriter != null) {printWriter.close();}if (bufferedReader != null) {try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}请大神指教下

解决方案

// 获取从客户端读入的字符串 String result = bufferedReader.readLine(); 这里会阻塞。你服务器端获取Socket以后 需要另外启动一个线程去处理,你现在是单线程的服务器端设计,当然只能接收一次请求了。服务器端接收到Socket以后应该启动一个线程new Thread(new Runable(){ //你上面的哪些代码。}).start();
解决方案二:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; BufferedReader bufferedReader = null; PrintWriter printWriter = null; try { serverSocket = new ServerSocket(2123); socket = serverSocket.accept(); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter = new PrintWriter(socket.getOutputStream(), true); int i = 1; while (true) { System.out.println("accept " + i); System.out.println("begin " + i++ + ": " + "accept"); // 获取从客户端读入的字符串 String result = bufferedReader.readLine(); System.out.println("Client say : " + result); if ("bye".equals(result)) { System.out.println("Client say : " + result); printWriter = new PrintWriter(socket.getOutputStream()); printWriter.print("hello Client, I am Server! bye-bye."); printWriter.flush(); break; } // 由Socket对象得到输出流,并构造PrintWriter对象 printWriter.println("hello Client, I am Server!"); printWriter.flush(); //printWriter.close(); //bufferedReader.close(); } printWriter.close(); bufferedReader.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } if (printWriter != null) { printWriter.close(); } if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class SocketClient { public static void main(String[] args) { Socket socket = null; PrintWriter printWriter = null; BufferedReader bufferedReader = null; try { socket = new Socket(InetAddress.getLocalHost(), 2123); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); printWriter = new PrintWriter(socket.getOutputStream(), true); int i=1; BufferedReader bufIn = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("input " + i); String result = bufIn.readLine(); System.out.println("client input data " + i++ + ": " + result); printWriter.println(result); printWriter.flush(); String serverStr = bufferedReader.readLine(); System.out.println("Server : " + serverStr);// 在标准输出上打印从Server读入的字符串 if (result.equals("bye")) { bufIn.close(); break; } } printWriter.close(); bufferedReader.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if(socket != null) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(printWriter != null) { printWriter.close(); } if(bufferedReader != null) { try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
解决方案三:
使用NIO吧,推荐mina或者netty

时间: 2024-08-06 23:57:58

socket双向通信,为什么服务器只能接收一次客户端发送的消息的相关文章

javascript-$.ajax服务器只能接收到第一次请求

问题描述 $.ajax服务器只能接收到第一次请求 webapp的开发 提交post请求,第一次xhr.readyState是1234分别出现xhr.status最后是200 返回数据正常 第二次开始,xhr.readyState是1,2,4 并没有3出现,xhr.status也是200 但是服务端接收不到请求,xhr.responseText为空 cache为true或者false时都这样,xhr.open 中同步异步的 true和false也改过 效果一样 已经增加了时间参数 百度了一下得到有

使用Axis向服务器端发送SOAP消息,服务器接收不到客户端发送的参数

问题描述 本程序是参照网上的一个程序改写的,服务器端是我用JAX-WS创建的一个简单web服务,但是该服务器却接收不到客户端传入的参数,接收到的参数为null.同样用这个客户端调用网上的那个天气预报的web服务,是没有问题的.请各位帮忙看一下,问题出在什么地方?importorg.apache.axiom.om.OMAbstractFactory;importorg.apache.axiom.om.OMElement;importorg.apache.axiom.om.OMFactory;imp

信息通讯-java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端

问题描述 java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端 socket连接部分可以省略 只要客户端的发送数据部分和服务端的接收数据部分我主要不知道java和C#的字符集以及该用什么方法比较好 解决方案 C#可以用system.text.encoding命名空间下的Encoding.GetEncoding(字符串编码名).GetBytes/GetString编码解码.其中编码名支持常见的编码,比如utf gb2312 unicode等等. 解决方案二: c

socket通讯 android-请求:java写的客户端发送数据失败!!

问题描述 请求:java写的客户端发送数据失败!! 连接时,给服务端发送数据时总是报错!! 11-28 11:15:36.164: D/MainActivity(4212): wifiname:"LcyAP_03001" prxFlag:true substr: LcyAP FirstConn:true 11-28 11:15:36.164: D/MainActivity(4212): Now Ready to create connect to LC:Now wifi stat is

c#socket双向通信,收不到服务器的反馈信息

问题描述 c#socket双向通信,收不到服务器的反馈信息 请问大神们:为什么c#socket通信时,同步的,客户端必须先收到服务器的应答,才开始发送数据,但是在服务器收到数据处理完后,反馈给客户端时为什么收不到了? 解决方案 服务器代码: namespace serverfile { public partial class Form1 : Form { string fileaddr = @"C:Documents and SettingsAdministrator桌面filetrserve

异常处理-,手机端请求服务器,他只能接收到我传给他的数据,其他的错误信息他不能看见,怎样解决?

问题描述 ,手机端请求服务器,他只能接收到我传给他的数据,其他的错误信息他不能看见,怎样解决? 例如500,404这些信息,手机端请求服务器,他只能接收到我传给他的数据,其他的错误信息他不能看见,怎样解决 解决方案 500,404这些信息,其实都是服务器返回给客户端的,本来服务器端就知道这些东西

mina做服务socket做客户端(发送数据过大拆成了几条ByteBuffer如何接收)

问题描述 我用java的Mina做服务端接受Socket客户端发送过来的信息,但是发送的信息过大,会给拆成了3-4条ByteBuffer,我通过session将他们可以连接起来,但是关键的问题是如果客户端发送的数据特别多,由于使用了线程池可能出现丢弃数据的可能,而且因为数据特别多mina服务端在过滤器中处理混乱不能拼接成一条完整的数据了.请问那位大侠帮忙出个解决的方法让我能够将数据拼接成功谢谢各位 解决方案 解决方案二:我只能提供我做过的,用的不是Mina,是自己的发送和接收:每个超长的分段发送

udp通信 接收不到包-win7 下进行UDP通信测试发现UDP服务器无法接收到CLIENT的发送数据这是啥原因?

问题描述 win7 下进行UDP通信测试发现UDP服务器无法接收到CLIENT的发送数据这是啥原因? 进行UDP数据通信的时候,UDP的客户端用WIRESHARK抓包,能很明显的看到数据发出来了,数据格式也是正确的,但是服务那边的就是接受不到数据,接受卡在接受哪里不动了.查看防火墙,防火墙也是关了的:该程序在WINXP下通信都是正确的,哪位大侠能给下解决方案?总觉得是WIN7在哪里设置有问题:另外我查看QQ的设置,开放该应用程序的UDP协议为开放所有协议,还是不行. 解决方案 WIN7下UDP需

C/S架构,SOCKET连接,服务器和客户端之间通信为什么会丢包?

问题描述 C/S架构,SOCKET连接,服务器和客户端之间通信为什么会丢包? C/S架构,SOCKET连接,服务器和客户端之间通信为什么会丢包 解决方案 iOS用GcdAsyncsocket通信一个8000多字节的包只能收到一千多字节,这是什么原因