Java Socket、ServerSocket单线程简单实例

本文通过Java内置库展示了一个简单的服务端和多个客户端交互的例子。服务端使用ServerSocket的accept()方法监听客户端连接,一旦连接建立,即可通过Socket对象进行数据收发。客户端创建Socket连接服务器,双方在循环中保持连接状态,随时准备接收和发送信息。需要注意的是,由于采用单线程模式,服务端会按顺序处理每个客户端的请求,如果客户端在发送请求后立即关闭Socket,可能会导致'Connection reset by peer: socket write error'的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用java自带的类库实现一个服务端和多个客户端收发信息的例子。

服务器的程序直接用一个mian方法启动的Server端来实现:

package test;


import java.io.DataOutputStream;
import java.io.IOException;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
/** 
 * 单线程Web服务器 
 *  
 * @author deron
 *  
 */  
public class SingleThreadWebServer  
{  
  
    public static void main(String[] args) throws IOException  
    {  
        ServerSocket server = new ServerSocket(7711);  
        while (true)  
        {  
            Socket client = server.accept();
            System.out.println("新增连接:"+client.getInetAddress()+":"+client.getPort());
            handleReq(client);  
        }  
    }  
  
    /** 
     * 处理请求 
     * @param client 
     */  
    private static void handleReq(Socket client)  
    {  
    	System.out.println("处理客户端请求");
        try {
			DataOutputStream outputStream=new DataOutputStream(client.getOutputStream());
			outputStream.writeUTF("控制客户端输出字段");
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			outputStream.writeUTF("沉睡了10S后的操作");
			outputStream.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }  
  
} 

Socket client = server.accept();该语句调用了ServerSocket对象的accept()方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象Link-Socket。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端的Client读写数据。

在本机或者另一台机器上用main方法创建一个client:

package test;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class Client1 {
	public static void main(String[] args) {
		try {
			Socket MySocket=new Socket("127.0.0.1",7711);
			DataInputStream inputStream=new DataInputStream(MySocket.getInputStream());
			while(true){
				System.out.println("receive_msg:"+inputStream.readUTF());
				//inputStream.close();
				//MySocket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

在上面的代码启动后,服务端的控制台打印的值为:

新增连接:/127.0.0.1:62011
处理客户端请求

在客户端控制台打印的值为:

receive_msg:控制客户端输出字段
receive_msg:沉睡了10S后的操作

在开启服务端后,支持多个客户端连接到服务端,因为上述创建的是单线程服务端,所以要等上一个客户端的请求处理完才会处理下一个客户端的请求,因为上面的Server和Client端都有while(true)循环,所以客户端和服务端是一直连接随时接收信息的,如果客户端在新建Socket之后不用while的话,在执行一次请求之后立刻关闭,不管服务端有没有完成操作。在服务端延迟10S准备向客户端写信息时,报Connection reset by peer: socket write error的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值