0 0

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

如题,双向的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 block
					e.printStackTrace();
				}
			}
			if(printWriter != null) {
				printWriter.close();
			}
			if(bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.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 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();
				}
			}
		}
	}
}


请大神指教下
2014年3月28日 14:45

3个答案 按时间排序 按投票排序

0 0

采纳的答案

// 获取从客户端读入的字符串 
String result = bufferedReader.readLine();   这里会阻塞。
你服务器端获取Socket以后 需要另外启动一个线程去处理,你现在是单线程的服务器端设计,当然只能接收一次请求了。

服务器端接收到Socket以后应该启动一个线程

new Thread(new Runable(){
  //你上面的哪些代码。
}).start();

2014年3月28日 14:51
0 0

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(); 
                } 
            } 
        } 
    } 
}

2014年3月28日 16:38
0 0

使用NIO吧,推荐mina或者netty 

2014年3月28日 15:33

相关推荐

    socket通信,客户端向服务器传文件

    总结来说,Java中的Socket通信为客户端和服务器提供了双向通信的接口,可以用于文件传输。客户端通过建立Socket连接,读取文件内容并写入Socket的输出流,而服务器端则接收这些数据并保存到本地。这个过程涉及到了...

    SuperSocket 入门,实现客户端和服务端消息互发

    6. 客户端接收到服务端的回应,完成一次消息交互。 **总结** SuperSocket 提供了一个高效、灵活的平台,使得开发者可以快速构建Socket应用程序,尤其适合需要实现客户端与服务器之间实时通信的场景。通过以上步骤...

    服务器和客户端进程的简单SOCKET通讯

    - **Socket**:Socket在操作系统层面是一个数据接口,用于两个网络应用程序之间进行双向通信。它可以看作是进程间通信的端点,分为流式(TCP)和数据报(UDP)两种类型。 2. **TCP Socket通信** - **三次握手**...

    Android手机客户端与服务器之间通信socket

    在Android中,我们通常使用java.net.Socket类来创建Socket对象,实现客户端与服务器端的双向通信。Socket通信基于TCP/IP协议,确保数据的有序性和可靠性。 二、Android客户端Socket通信步骤 1. 创建Socket对象:...

    socket 实现客户端和服务端的双向通信

    双向通信意味着客户端和服务端都能发送和接收数据。在实际应用中,通常会用到多线程或异步IO模型,使得两者可以同时处理发送和接收。例如,服务端可以开启一个新线程或使用`asyncio`库来处理每个客户端的请求,从而...

    Socket服务器与客户端双向通信实现代码

    Socket服务器与客户端双向通信是网络编程中的一个基本概念,它允许两个程序通过网络进行数据交换。在本文中,我们将深入探讨如何使用C#语言来实现一个基于Socket的双向通信系统。 首先,我们要了解Socket的基本原理...

    很简单的一个socket双向通信小程序源代码

    在这个"很简单的一个socket双向通信小程序源代码"中,我们可以预期看到的是如何使用Socket实现客户端和服务器之间的双向通信。Socket通信通常涉及TCP(传输控制协议)或UDP(用户数据报协议),但鉴于“双向”特性,...

    socket双向通信demo

    本示例"socket双向通信demo"着重展示了如何使用Java的Socket API实现客户端与服务器端之间的双向通信。在Eclipse这样的集成开发环境中,你可以直接导入并运行这些示例代码,以便深入理解Socket通信的工作原理。 ...

    c# socket 双向通信

    总结起来,C#中的Socket双向通信涉及到创建Socket实例、建立连接、发送和接收数据,以及可能的异步操作。理解这些概念并熟练运用是开发高效、可靠的网络应用的关键。在提供的压缩包文件中,可能包含了实现这些功能的...

    socket通信 不可多得的客户端与服务器端代码

    在IT领域,Socket通信是一种基于TCP/IP协议族的网络编程接口,用于实现不同网络设备间的双向通信。在Android系统中,Socket通信常用于构建客户端-服务器应用,例如即时通讯、在线游戏等。在这个项目中,我们看到的是...

    SOCKET双向通信

    Socket双向通信是指在客户端和服务器之间通过Socket进行的双向数据传输。在计算机网络编程中,Socket是一种基于TCP/IP协议的通信机制,它允许应用程序通过网络发送和接收数据。本实例展示了如何创建一个简单的Socket...

    C++写的服务器与Java写的客户端通过Socket通信java代码

    - 接受连接:当有客户端请求连接时,服务器使用`accept()`函数接收连接,并返回一个新的Socket句柄用于和客户端通信。 - 数据收发:服务器使用`recv()`和`send()`函数来读取和发送数据。 - 关闭连接:完成通信后...

    C# socket实现服务器客户端通信

    本项目"**C# socket实现服务器客户端通信**"是针对TCP/IP协议进行设计的,通过Visual Studio 2012(VS1012)开发环境构建,它涵盖了服务器端和客户端的实现,让我们深入探讨这一主题。 首先,Socket是基于TCP/IP...

    采用socket技术实现客户端与服务器端的通信

    Socket技术是计算机网络编程中的重要组成部分,主要用于实现客户端与服务器端之间的双向通信。在这个过程中,客户端发起连接请求,服务器响应并建立连接,然后双方就可以通过这个连接交换数据。本篇文章将详细探讨...

    客户端和服务器端通信程序C#代码

    - 在新的Socket上使用Receive方法接收客户端发送的数据,使用Send方法回应客户端。 - 服务器也需要管理好连接,确保资源的有效释放。 3. **聊天实例程序的扩展**: - 聊天程序通常需要维护一个用户列表,记录...

    Socket发送并接收服务器返回的数据

    首先,理解Socket的基本概念:Socket,又称为“套接字”,是网络编程中的一个接口,它提供了进程间通信(IPC,Inter-Process Communication)的能力,尤其在网络环境中,允许两个应用通过TCP/IP协议进行双向通信。...

    C Socket通信多线程数据双向收发实例VS2010(全部源码)

    3、实现客户端向服务器端发送不同测试命令,并接收服务器端发送的数据; 4、运用指针上下文实现不同线程的数据共享; 5、实现多个客户端同时连接服务器端; 6、服务器端程序和客户端程序可以运行在同一台计算机,也...

    基于socket的客户端与服务器聊天

    全双工通信意味着客户端和服务器都可以在同一时间发送和接收数据,这要求Socket连接具有双向通信的能力。在TCP/IP协议栈中,TCP(传输控制协议)提供了一个可靠的、面向连接的全双工通信通道,适合此类应用。 在...

    Qt 客户端 服务器 双向通信

    在实现双向通信时,通常会创建两个独立的套接字,一个用于发送,另一个用于接收,确保数据流的并发处理。 以下是实现Qt客户端服务器双向通信的关键步骤: 1. **服务器端**: - 创建QTcpServer对象,监听特定端口...

    C#版Socket通信含服务端、客户端、WebSocket,代码完整清晰

    Socket通信在IT行业中是网络编程的基础,特别是在C#开发中,它被广泛用于构建服务器和客户端应用程序,实现数据的高效传输。本项目包含了一个完整的C#版Socket通信示例,涵盖了服务端、客户端以及WebSocket的实现,...

Global site tag (gtag.js) - Google Analytics