`

socket编程(二)--服务器端实现多线程处理客户端请求

阅读更多

需求:与socket编程(一)相同的需求

客户端代码如下:

package com.socket.clientsocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Sclient {

	/**
	 * @param args
	 */
	
	protected BufferedReader socketReader;
	protected PrintWriter socketWriter;
	protected String hostIp;
	protected int hostPort;
	
	
	public Sclient(String ahostIp,int ahostPort){
		this.hostIp = ahostIp;
		this.hostPort = ahostPort;
		
	}
	public void setUpConnection(){
	
		try {
			//1.创建Socket,建立连接
			Socket socket = new Socket(hostIp,hostPort);
			//2.获取输入流和输出流,并进行封装
			socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			socketWriter = new PrintWriter(socket.getOutputStream());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void tearDownConnection(){
		
		try {
			socketReader.close();
			socketWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
	//根据需求,对流进行处理
	public String getFile(String fileNameToGet){
		StringBuffer sb = new StringBuffer();
		socketWriter.println(fileNameToGet);
		socketWriter.flush();
		String line = null;
		try {
			while((line = socketReader.readLine()) != null){
				sb = sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		//创建客户端
		Sclient client = new Sclient("198.27.0.166",8200);
		//建立连接
		client.setUpConnection();
		//需求操作
		String content = client.getFile("c:\\log.txt");
		//关闭连接
		client.tearDownConnection();
	}

}

 服务器端代码如下:

package com.socket.multiserversocket;

import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

public class SserverM {

	/**
	 * @param args
	 */
	
	protected int listenPort = 3000;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		SserverM server = new SserverM();
		
		server.acceptConnections();

	}
	
	//将处理丢给一个实现Runnable接口类的新线程
	public void handleConnection(Socket connectionToHandle) {
	     new Thread(new ConnectionHander(connectionToHandle)).start();
	}


	
	public void acceptConnections() {
        try {
        	//5为最多等待客户端数目,连上正在处理的请求,总共能处理6个,如果再有请求,将拒绝连接
        ServerSocket server = new ServerSocket(listenPort, 5);
        Socket incomingConnection = null;
        while (true) {
            incomingConnection = server.accept();
            handleConnection(incomingConnection);
        }
    } catch (BindException e) {
    System.out.println("Unable to bind to port " + listenPort);
    } catch (IOException e) {
    System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
    }
}


}

 实现Runnable接口的处理器

package com.socket.multiserversocket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ConnectionHander implements Runnable {
	
	protected Socket incommingSocket;
	
	public ConnectionHander(Socket aIncommingSocket){
		this.incommingSocket = aIncommingSocket;
	}

	public void run() {
		
		try {
			InputStream inputFromSocket = this.incommingSocket.getInputStream();
			OutputStream outputToSocket = this.incommingSocket.getOutputStream();
			
			BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));
			FileReader fileReader = new FileReader(new File(streamReader.readLine()));
			
			
			BufferedReader bufferedFileReader = new BufferedReader(fileReader);
			
			PrintWriter socketWriter = new PrintWriter(outputToSocket);
			String line = null;
			while((line = bufferedFileReader.readLine()) != null){
				socketWriter.println(line);
			}
			
			streamReader.close();
			fileReader.close();
			socketWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	
		
		

	}

}
 
分享到:
评论

相关推荐

    socket编程示例--聊天软件服务器端+客户端

    在聊天软件服务器端,可能会有多个客户端同时发起连接,因此服务端通常需要使用多线程来保证并发处理能力。 **源代码**: `socketTCPclient.cpp` 和 `socketTCPserver.cpp` 是实现聊天功能的源代码文件。客户端代码...

    Java多线程-Socket编程

    Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...

    SOCKET实例---服务器端和客户端程序

    服务器端负责监听并响应客户端的请求,而客户端则负责发起连接并交换数据。这种基础的Socket编程模型可以作为进一步开发复杂网络应用的基础,如聊天室、文件传输等。在实际应用中,还需要考虑错误处理、多线程、并发...

    【Socket编程】--TCP异步通讯一服务器多客户端

    总结起来,TCP异步通讯一服务器多客户端的实现涉及TCP协议栈的使用、服务器端的并发处理策略以及异步I/O模型的选择。这种技术对于构建高并发、高性能的网络服务至关重要。通过实践和学习提供的代码资源,你将能够更...

    c#多线程socket开发(一个服务器对多个客户端)

    在服务器端的多线程实现中,我们使用while循环不断地监听客户端的连接请求,并在accept方法中创建一个新的ClientThread对象,以便处理客户端的连接请求。 多线程Socket服务器端程序的优点 使用C#语言开发多线程...

    vc socket tcp 多线程客户端--服务器结构的例子.visual c++

    本文将深入探讨基于Visual C++的TCP多线程客户端-服务器结构,并以"vc socket tcp 多线程客户端--服务器结构的例子"为例进行解析。这个例子包含了一个名为"RawSocketServerExample"的文件,很可能是实现此架构的源...

    SOCKET 网络编程 计算机网络 作业 客户端 服务器端 client svever

    - **服务器端**:等待并响应客户端请求的一方,通常持续监听特定端口,一旦有连接请求,就创建Socket与客户端建立连接。 4. **Socket编程步骤**: - **服务器端**: - 创建ServerSocket,指定监听的端口号。 - ...

    实战linux socket编程--示例源码.rar_C++ socket_linux 源码_socket 编程 linux_s

    - 为了处理多个客户端连接,服务器端通常会采用多线程或者异步I/O模型。 - 每个客户端连接可以分配一个独立的线程进行处理,避免阻塞其他连接。 7. **实战示例源码分析** - “www.pudn.com.txt”可能是一个文档...

    MFC_Socket_VS2010编程(客户端+服务器端).rar

    此外,为了提高性能和用户体验,可以考虑使用多线程或者异步Socket模型,使服务器能够同时处理多个客户端的连接请求。 这个示例代码是一个很好的学习起点,它展示了如何在MFC环境中使用Socket进行基本的客户端-...

    编程例子-Qt多线程的socket客户端-Qtsocket服务端

    标题"编程例子-Qt多线程的socket客户端-Qtsocket服务端"揭示了这个压缩包中的内容是关于使用Qt框架进行网络编程的实例,具体涉及到了多线程的socket客户端和服务器端的实现。这通常意味着我们将深入到网络通信的基础...

    服务器多线程多客户端程序

    多线程允许程序在同一时间执行多个任务,提高了程序的并行性,尤其在服务器端处理并发请求时,可以显著提高系统资源的利用率。 - **创建线程**:在C#中,可以通过继承`System.Threading.Thread`类或者使用`...

    用Socket实现客户端和服务器端通信(完整版)

    本文将详细介绍使用Socket实现客户端和服务器端通信的知识点,包括Socket的基本概念、Socket编程模型、服务器端和客户端的实现、数据传输和处理、线程安全和控件更新等方面。 Socket基本概念 Socket是操作系统提供...

    delphi多线程socket服务器客户端

    - 在服务器端的OnAccept事件中,创建TThread子类实例,覆盖Execute方法以处理客户端请求。 - 在Execute方法中,可以使用TThread.Synchronize访问UI线程,安全地更新用户界面。 4. 安全通信 - 考虑到网络通信的...

    Java Socket编程实现的简单多线程WEB服务器

    我们介绍了 ServerSocket 和 Socket 的使用,并使用多线程编程来处理来自客户端的连接请求。我们的示例代码展示了如何使用 HTTP 协议来与客户端进行通信。这个简单的 WEB 服务器可以用来测试和学习网络编程的基础...

    Linux网络编程-网络基础-socket编程-高并发服务器.pdf

    - 连接与接受:客户端使用`connect()`函数发起连接请求,服务器端通过`accept()`函数接收连接请求,生成一个新的socket描述符用于与客户端通信。 - 发送与接收数据:使用`send()`和`recv()`函数在连接的socket之间...

    TCP与UDP客户服务端实现大小写及SOCKET编程实现聊天程序

    在SOCKET编程实现聊天程序中,使用Java语言编写了一个简单的客户端和服务器端程序。服务器端使用ServerSocket来监听客户端的连接请求,而客户端使用Socket来连接服务器端。 在服务器端,使用BufferedReader和...

    QT 多线程TCP服务器与客户端

    QTcpServer是QT提供的服务器端组件,用于监听并接受来自客户端的连接请求。创建一个QTcpServer实例,设置监听端口,然后重写其`newConnection()`信号的槽函数,以便当有新的客户端连接时进行处理。同时,我们还需要...

    C#SOCKET 客户端与主机通讯多线程实现

    总结来说,"C# SOCKET 客户端与主机通讯多线程实现"是一个涉及网络编程和多线程技术的项目。通过理解和应用这些知识点,开发者可以构建出能够处理高并发连接的服务器和高效通信的客户端。在实践中,还需要考虑异常...

    vc socket编程,多线程聊天,包括客户端以及服务器端

    本项目以"VC Socket编程,多线程聊天,包括客户端以及服务器端"为主题,使用了Microsoft Visual C++ 6.0(简称VC6.0)作为开发工具,展现了如何通过C++语言实现基于Socket的多线程聊天应用。 首先,我们要理解...

    基于socket编程的客户端和服务器端程序

    - 在TCP模式下,服务器端需要维持一个线程池来处理并发的客户端连接,每个连接对应一个线程,保证每个客户端都能独立聊天。 - UDP模式下,由于无连接特性,服务器端和客户端可以直接广播或单播数据报,但需要自行...

Global site tag (gtag.js) - Google Analytics