`

Socket 学习笔记(二)Socket之支持多客户的client/server程序

 
阅读更多
 前一章的Client/Server程序只能实现Server和一个客户的对话。在实际应用 中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响 应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。

(一)每一个请求需完成的任务,具体内容如下
package com.mytest.socket;

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

public class SocketTask implements Runnable{

	private Socket socket;
	private String name;
	
	public SocketTask(Socket socket,String name)
	{
		this.socket=socket;
		this.name=name;
		System.out.println(name+"开始.....");
	}
	
	@Override
	public void run() {
		
       InputStream in = null;
	try {
		in = socket.getInputStream();
		byte []buff=new byte[100];
		 StringBuffer sb=new StringBuffer();
		 //读取客户传送的信息
		 while(in.read(buff)!=-1)
		 {
			String str= new String(buff,"UTF-8").trim();
			sb.append(str); 
		 }
		 in.close();
		 System.out.println("接收到信息:"+sb.toString());
		 System.out.println(name+"完成");
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally
	{
		
			try {
				if(in!=null)
				{
				 in.close();
				}
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	
		
		
	}

}




(二)服务端接收到请求后需完成的动作,具体代码如下
package com.mytest.socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SocketSevice {

	//侦听端口
	private  int port;
	
	private  ServerSocket serverSocket;
	
	//最大连接
	private static  int maxCount=3;
	
	//连接数量累计
	private  int index=0;
	
	private static final SocketSevice socketSevice=new SocketSevice(); 
	
     //任务线程池
	private  ExecutorService threadPool=Executors.newFixedThreadPool(maxCount);
	
	private SocketSevice(){}
	
	public static SocketSevice getInstance() 
	{
	
		return socketSevice;
	}
	
	public void listening(int port) throws IOException
	{
		this.port=port;
		serverSocket=new ServerSocket(port);
		
		//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行
		while(true){	
		    Socket socket=serverSocket.accept();
		     SocketTask task=new SocketTask(socket,"任务"+index);
			 threadPool.execute(task);
			 index++;
		    
		   
		}
		
		
	}
	
	public static void main(String[] args) 
	{
		SocketSevice s=SocketSevice.getInstance();
		try {
			s.listening(1099);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	
	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
	
	
	
}




(三)模拟多个客户端对服务器发出请求,修改上一章中SocketClient类的main方法,代码如下
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			for(int i=0;i<5;i++){
			SocketClient client=new SocketClient("127.0.0.1",1099);
			client.writeString("哈哈哈"+i);
			client.close();
			
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
   
	}



先运行服务端代码(SocketServer),然后再运行客户端代码(SocketClient),效果如下







  • 大小: 9.2 KB
  • 大小: 10 KB
分享到:
评论

相关推荐

    Socket网络编程学习笔记

    Socket网络编程是计算机网络通信的核心技术之一,它允许两台或多台计算机通过互联网进行数据交换。在本学习笔记中,我们将深入探讨Socket编程的基本概念、原理以及如何在实际项目中应用。 首先,Socket是网络通信的...

    Netty4.0学习笔记系列之一:Server与Client的通讯

    在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...

    C#之TcpClient,UdpClient,Socket入门实例

    在提供的"Socket积累"文件中,可能包含了关于这些主题的代码示例、学习笔记或者常见问题解答,这些都是深入理解和掌握C#网络编程的宝贵资源。建议仔细研究这些材料,结合实践操作,以加深理解并提升技能。同时,不断...

    Python学习笔记-基于socket基础的http服务端程序

    client_socket, addr = server_socket.accept() print(f"接收到来自{addr}的连接请求") # 接收客户端发送的数据 request_data = client_socket.recv(1024).decode('utf-8') # 分析请求,处理HTTP请求行 ...

    Python学习笔记——socket通信相关资源文件

    `server1.py`, `server2.py`, 和 `server3.py`是三个不同的服务器端程序,它们可能演示了不同类型的socket服务器实现。这些服务器通常会监听特定的端口,等待客户端的连接请求。一旦有客户端连接,服务器就可以接收...

    socket学习笔记

    本文将深入探讨“Socket学习笔记”中的核心知识点,主要通过分析提供的两个Java文件——SocketServer.java和SocketClient.java来阐述。 首先,Socket在计算机网络中扮演着客户端与服务器端通信的关键角色。它是一种...

    Socket网络编程学习笔记之---使用线程池提高性能

    本篇学习笔记将深入探讨如何结合Socket与线程池来提升程序的运行效率。 一、Socket基础 Socket,也称为套接字,是网络编程中的一个重要概念,它是进程间通信(IPC)的一种方式,特别是在网络环境中。Socket提供了一...

    基于C/S模式socket编程实例

    【标题】"基于C/S模式socket编程实例"指的是在客户端/服务器(Client/Server)架构下,通过Socket接口进行通信的编程示例。Socket是网络编程中的基础接口,它允许两个程序通过网络进行数据交换。在C/S模式中,客户端...

    Java 客户端服务器程序 学习笔记

    在Java编程领域,客户端-服务器(Client-Server)程序是一种常见的架构模式,它涉及两个主要组件:客户端应用程序和服务器端应用程序。在这个“Java客户端服务器程序学习笔记”中,我们将深入探讨这一主题,包括如何...

    JAVA 自己的学习笔记总结

    ### JAVA学习笔记:Socket通信详解 #### 一、Socket通信概念与原理 Socket通信是Java网络编程中的核心概念,它提供了在不同计算机之间进行数据交换的能力。Socket可以被视为两个程序间进行通信的端点,一个Socket...

    Socket网络编程学习笔记(3)

    在本篇《Socket网络编程学习笔记(3)c# yuanma》中,我们将深入探讨如何使用C#中的套接字助手类来简化Socket编程过程,使初学者更容易掌握网络编程的基本概念。本文主要围绕服务端的侦听模式、接收客户端连接以及如何...

    Linux网络编程socket编程学习

    自学Linux网络编程关于socket的编写,包括 server.c 和 client.c 的编写;很详细的介绍了网络套接字socket的C/S模型TCP协议的服务器端和客户端的程序函数以及编写过程;重点介绍多路I/O转接服务器的实现,包括select...

    模仿QQ通信的socket聊天室

    总的来说,这个项目为我们提供了一个学习和实践Socket编程,尤其是多线程Socket通信的绝佳机会。通过分析和理解代码,我们可以掌握如何构建一个简单的网络聊天应用,这对于深入理解网络编程和并发处理至关重要。同时...

    基于学习Socket的丛林战争服务器端笔记

    在标题“基于学习Socket的丛林战争服务器端笔记”中,我们接触到的关键词是“学习Socket”和“丛林战争服务器端”。从这些信息中,我们可以推断出文档内容主要涉及使用Socket编程来构建一个服务器端程序,该程序可能...

    python中关于网络socket使用实例,供大家参考使用

    二、连接Socket 对于客户端,我们需要使用`connect()`方法连接到服务器的特定端口。例如,连接到IP地址'127.0.0.1'和端口号8080: ```python s.connect(('127.0.0.1', 8080)) ``` 服务器端则需要使用`bind()`方法...

    Nodejs学习笔记之NET模块

    Socket不是一种协议,而是调用接口,允许应用程序通过TCP或UDP进行通信。HTTP协议则属于应用层,主要处理数据的格式和内容,常用于Web应用。 在Node.js中,HTTP模块是基于NET模块构建的,HTTP服务器通过封装NET模块...

    linux下TCP,UDP的C代码

    在Linux环境下进行网络编程,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要...文件中的"学习笔记"可能包含了关于网络编程的更深入知识,如错误处理、多线程、异步I/O等,这些都是在网络编程中必不可少的部分。

    用Java写的非常简易的类似聊天室程序

    在本项目中,我们探讨的是一个使用Java编程语言编写的简单聊天室程序,它由两个主要部分组成:服务器端(server1)和客户端(client1)。这个程序为用户提供了基本的实时文本通信功能,适用于学习Java网络编程和多...

Global site tag (gtag.js) - Google Analytics