`
清风送月
  • 浏览: 3362 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Socket 客户端不显示的关闭连接服务端read一直阻塞

阅读更多

初次学习socket,写了下面例子

public class SocketServer {

	public static void main(String[] args) {
		int port = 8089;
		ServerSocket server = null;
		InputStream in = null;
		Socket socket = null;
		try {
			server = new ServerSocket(port);
			System.out.println("server:服务端启动,端口 "+port);
			socket = server.accept();
			in = socket.getInputStream();
			byte[] b = new byte[1024];
			int n = 0;
			StringBuilder sb = new StringBuilder();
			while((n=in.read(b))!=-1){
				sb.append(new String(b,0,n));
			}
			System.out.println("server:我收到客户的msg-"+sb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(in !=null){
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(socket != null){
				try {
					socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(server !=null){
				try {
					server.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		

	}

}

 

public class SocketClient {

	public static void main(String[] args) {
		Socket socket = null;
		int port = 8089;
		String host ="127.0.0.1";
		OutputStream out = null;
		try {
			socket = new Socket(host,port);
			System.out.println("client:我连接上了服务端");
			out = socket.getOutputStream();
			out.write("你好".getBytes());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				Thread.sleep(10000);
				if(out != null){
					try {
						out.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				if(socket != null){
					try {
						socket.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		
		}
		

	}

}

 发现,当在客户端不close 相关的socket或输出流,服务端read会提示java.net.SocketException: Connection reset异常,这是由于client退出但是没有关闭连接导致。

当然,socket.shutdownOutputStream() 可以提示服务端,发送完成而不阻塞read

 

分享到:
评论

相关推荐

    C#SuperSocket服务端与客户端通信实例

    使用SuperSocket,你可以快速创建一个Socket服务端,处理来自客户端的连接请求。以下是一些关键步骤: 1. **安装SuperSocket**: 通过NuGet包管理器在你的C#项目中添加SuperSocket库。运行`Install-Package Super...

    socket服务端客户端简单程序

    本教程将通过一个简单的Socket服务端和客户端程序,帮助初学者理解Socket编程的基本原理和操作流程。 首先,我们来解释一下Socket。Socket,通常称为套接字,是操作系统提供的一种接口,用于网络上不同计算机之间的...

    socket编程,客户端给服务端发送消息

    6. **关闭连接**:当通信结束时,客户端和服务端都需要调用`close()`函数关闭Socket,释放网络资源。 在“ConsoleApplication1”这个文件中,很可能是包含了一个简单的C#控制台应用程序示例,演示了上述的客户端和...

    Socket客户端和服务端的编程实现(C和android附运行截图).docx

    - **编写客户端和服务器端代码**:创建能够正确建立Socket连接的客户端和服务端程序。 - **源代码附录**:提供完整的源代码,便于理解和验证。 #### 实验原理与设计 **Socket通信基础** - **Socket定义**:Socket...

    socket 客户端

    一旦连接建立,Socket客户端就可以通过Socket实例的`getOutputStream()`方法获取输出流,用于向服务端发送数据。在这个场景中,我们提到的是发送DataSet对象。DataSet通常是在.NET框架中用于存储和操作数据库数据的...

    C# socket多客户端访问服务端端口监听实例

    这样,服务端可以在不阻塞的情况下处理多个客户端请求。 总的来说,C#的Socket编程提供了强大的工具,允许开发者构建复杂的网络应用,包括多客户端访问服务端的端口监听。理解TcpListener和TcpClient的工作原理,...

    qt tcp 一个服务端对多个客户端

    4. **多线程处理**:在一个服务器端对多个客户端的场景中,通常会使用多线程技术来处理每个客户端的连接,防止主线程被阻塞。可以为每个新的客户端连接创建一个新的线程,将`QTcpSocket`对象传递给该线程进行处理。 ...

    C#网络通信之TCP连接,客户端和服务端的tcp收发信息

    本篇将深入探讨C#中如何实现TCP连接,包括客户端和服务端的TCP收发信息。 首先,TCP是一种面向连接的、可靠的传输协议,它确保了数据的顺序传输和错误校验。在C#中,我们主要通过System.Net.Sockets命名空间中的...

    android客户端服务端采用Socket通信

    在Android客户端中,我们通常使用`java.net.Socket`类来创建Socket实例,以连接到服务端。首先,我们需要指定服务器的IP地址和端口号,然后调用`connect()`方法建立连接。以下是一个简单的示例: ```java Socket ...

    Android客户端和服务端通过Socket收发文字和图片

    - 由于Socket通信通常是阻塞式的,为了不影响用户界面,客户端和服务端的Socket读写操作应该在单独的线程中进行。 6. **安全性和性能优化** - 考虑到网络安全,可以使用SSL/TLS加密Socket(`SSLSocket`)以提高...

    socket应用 简单的实现客户端与服务端交流

    本教程将聚焦于Linux环境下的Socket编程,讲解如何通过C语言实现简单的客户端与服务端的交互,主要涉及TCP(Transmission Control Protocol)传输协议。 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议...

    java socket网络编程代码(服务端和客户端)

    然后,通过调用`accept()`方法,服务端会阻塞等待直到有客户端尝试连接。一旦连接建立,`accept()`方法将返回一个新的`Socket`对象,用于与特定客户端的通信。 服务端的主要代码结构如下: ```java try ...

    服务端向多客户端通信_C语言_sockettcp_socket_tcp_linux_

    总之,利用C语言的TCP Socket在Linux下实现服务端向多客户端通信,需要理解套接字API的使用,掌握TCP连接的过程,以及如何在服务端处理并发连接。这个过程涉及的代码示例可以在提供的"服务端向多客户端通信"文件中...

    C# socket 服务端与客户端通信演示代码

    在本文中,我们将深入探讨C#中的套接字(socket)编程,特别是在服务端与客户端之间的通信。套接字是网络编程的基础,它允许不同计算机上的应用程序之间进行数据交换。C#提供了System.Net.Sockets命名空间,其中包含...

    Android手机之间的蓝牙通信客户端和服务端代码

    当有客户端连接时,`BluetoothServerSocket.accept()`会阻塞,直到连接建立: ```java BluetoothSocket socket = serverSocket.accept(); ``` 5. **创建蓝牙客户端(客户端)** 客户端需要连接到服务器的蓝牙...

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

    - 使用`accept()`方法接收客户端的连接请求,这会阻塞直到有客户端连接。 - 当客户端连接后,`accept()`返回一个新的`Socket`对象,服务器可以通过这个Socket与客户端通信。 - 读取Socket的输入流(`InputStream`...

    SOCKET客户端 发送数据例子

    在IT领域,网络编程是不可或缺的一部分,而Socket编程则是实现客户端与服务器通信的关键技术。本示例中的"SOCKET客户端 发送数据例子"是用C语言编写的,它封装了发送和接收数据的函数,与相应的服务端配合使用,构成...

    socket服务端和客户端通讯

    在本主题中,我们将深入探讨"socket服务端和客户端通讯"的核心概念、步骤以及关键知识点。 首先,Socket是Internet上的应用程序之间进行通信的一种机制,它提供了一种标准接口,使得应用层可以直接与传输层进行交互...

    C# Socket聊天服务端程序

    创建Socket服务端的第一步是实例化一个Socket对象,并指定其使用的协议类型。在TCP/IP环境中,通常选择StreamSocket或TcpListener。这里我们使用TcpListener,它专门用于监听TCP连接请求。创建TcpListener时,需要...

    esp32 tcp 服务端和客户端程序

    - 监听连接:调用`server.accept()`函数,当有客户端连接时,返回一个Socket对象用于与客户端通信。 - 数据处理:在循环中接收客户端发送的数据,可以使用`socket.readBytes()`读取指定长度的字节,然后进行解析和...

Global site tag (gtag.js) - Google Analytics