`
lfc_jack
  • 浏览: 139066 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

socket编程三,实现多个客户端同时请求的一个服务端

阅读更多
在我的文章的socket编程二中虽然实现面向对象的编程的思想,但是还有一个致命的缺点,无法实现多用户同时请求,一旦出现多用户的时候,便会报错,所以下面再继续对socket二进行修改

第一步:再次新建一个 java project,再增加一个类,多线程类,重写父类的run方法,实现处理用户的请求,如下图所示



第二步:增加ServerThread类的代码如下:
package com.socket.Thread;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import com.socket.entity.User;

/**
 * 线程类
 * 
 * @author lfc
 * 
 */
public class ServerThread extends Thread {
	// 创建一个和本线程相关的socket
	Socket socket = null;
	//当创建一个线程的时候,创建一个socket
	public ServerThread(Socket socket){
		this.socket=socket;
		
		
	}
	//启动线程,重写父类的方法
	
	public void run(){

		System.out.println("服务器端准备好监听客户端的请求了。。。");
		try {
			
			// 3:获得输入流
			InputStream is = socket.getInputStream();
			// 包装下变成字符流,实现可以对对象进行反序列话操作
			ObjectInputStream ois=new ObjectInputStream(is);
			//创建输出流,用来给客户端提示的响应信息
			OutputStream os = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(os);
			// 4:读取对象,获得对象
			User user=(User)ois.readObject();
			System.out.println("编号:"+user.getId());
			System.out.println("年龄:"+user.getAge());
			System.out.println("姓名:"+user.getName());
			System.out.println("密码:"+user.getPassword());
			//给客户端的回应信息
			String response="客户端已经收到你们的信息了,Success";
			pw.write(response);
			pw.flush();
			// 5:关闭资源,注意,关闭的时候,要从底部开始往上依次关闭,顺序不能错!
			os.close();
			pw.close();
			ois.close();
			is.close();
			socket.close();

		} catch (IOException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}

		
	}

}




第三步,User类的代码请看前面的socket二中的代码,没有修改。


第四步,修改SocketServer的服务端的代码后如下:

package com.socket.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import com.socket.Thread.ServerThread;
import com.socket.entity.User;

/**
 * 服务器端
 * 
 * @author lfc 对于这个客户端以及服务端,运行的时候,必须先服务端开始运行起来,开始监听客户端的程序请求
 * 缺点:如果是登录程序中只能监听一个用户登录程序就会进入死亡转态了
 * 为了解决多用户能够同时进行请求,需要用多线程序来改造代码
 */
public class SocketServer {

	public static void main(String[] args) {
		
		
		try {
			// 1:创建一个服务端的ServerScoket,绑定端口开始监听
			ServerSocket serverScoket = new ServerSocket(8800);
			// 2:使用accept()方法阻塞等待连接,获得新的连接
			Socket socket = null;
			//加入一个统计来自客户端的请求的数目
			int num=0;
			//一直处于监听的运行转态
			while (true) {
				socket=serverScoket.accept();
				ServerThread serverThread=new ServerThread(socket);
				//启动线程
				serverThread.start();
				num++;
				System.out.println("客户端请求的次数为:"+num);
			}

		} catch (IOException e) {

			e.printStackTrace();
		}

		
	}

}




第五步:客户端的代码  loginClient代码没有修改,请查看前面的socket二中的客户端的代码:


第六步:运行服务器端的代码:如下图所示,服务器处于监听转态:




第七步,运行客户端的代码,如下图所示




第八步,此时再次查看服务器端打印出来的内容如下图所示:




第九步,我们修改客户端的User的名字为jack   密码也修改下,然后运行一次客户端的代码,再次查看服务器端的输出内容:






到此为止,我们就实现了利用socket面向对象编程,并且实现对用户同时发送请求,如果还想要好玩点,可以把服务器端的代码放到另外的一台电脑上运行,多个客户端在电脑上,同时发送请求,主要修改的地方时,客户端发送请求的ip要需改为对应服务器端电脑的ip地址即可。






  • 大小: 13.8 KB
  • 大小: 10.6 KB
  • 大小: 13.8 KB
  • 大小: 14 KB
  • 大小: 13.1 KB
  • 大小: 19.7 KB
分享到:
评论

相关推荐

    Windows Socket 通信网络编程

    实现方式:所有的Socket 编程方式全部采用Windows API 函数调用,未采用封装好的C++ socket 类进行实现,适用于底层编程的参考和学习,采用多线程的方式实现并发处理,支持多个客户端同时访问服务端 适用范围和参考...

    Java TCPIP Socket编程 源码

    一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的...

    socket编程,CS间相互通讯(含实验报告)

    2)服务端程序能响应单个或任意多个客户端连接请求;服务端能向单个客户发送消息,支持群发消息给所有客户端; 3)通信的双方具备异常响应功能,包括对方异常退出的处理。如果客户端退出,服务器有响应;反之亦然。 ...

    实验1:Socket通信实验

    2)服务端程序能响应单个或任意多个客户端连接请求;服务端能向单个客户发送消息,支持群发消息给所有客户端; 3)通信的双方具备异常响应功能,包括对方异常退出的处理。如果客户端退出,服务器有响应;反之亦然。

    基于C语言 Socket 接口实现自定义协议通信【100011735】

    掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包 开发一个客户端,实现人机交互界面和与服务器的通信 开发一个服务端,实现并发处理多个客户端的请求程序界面不做要求,使用命令行或最简单的...

    C#套接字编程实例_UDP_TCP通信

    范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来 连接,服务程序 等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。 客户端在需要的时刻发出向服务端的连接...

    基于C++实现(控制台)Socket 接口实现自定义协议通信【100010754】

    根据自定义的协议规范,使用 Socket 编程接口编写基本的网络应用软件。掌握 C 语言形式的 Socket 编程接口用法,...开发一个服务端,实现并发处理多个客户端的请求。程序界面不做要求,使用命令行或最简单的窗体即可。

    基础深化和提高-网络编程

    Socket编程:基于Socket套接字,通过TCP或UDP协议进行网络通信。通过创建Socket对象,程序可以在网络上进行数据传输和通信。 URL和URLConnection:Java提供了java.net.URL和java.net.URLConnection等类,用于访问...

    基于Linux C++和socket网络编程的即时通信系统源码+项目说明(课程设计).zip

    支持多个客户端接入,实现聊天室基本功能 2.启动服务,建立监听端口等待客户端连接 3.使用epoll机制实现并发,增加效率 4.客户端连接时,发送欢迎消息,并存储连接记录 5.客户端发送消息时,根据消息类型,广播...

    socket数据通讯编程

    通过TServerSocket和TClientSocket组件开发客户端和服务端程序,ServerSocket组件可以同时接受一个或多个...因此,一个服务器端可以为多个客户端服务。 压缩包里包含编译后的exe,还有完整的客户端和服务端源代码。

    C++项目-C++实现云盘项目实战-包括client端和server端

    该项目是在linux下采用C/C++编程,基于TCP协议,服务器端采用多进程长连接的socket的通信方式,并采用开源的负载均衡器G6作为客户端请求与服务端响应的中间件分发器。考虑到服务器端如果每接收到一个请求fork一个...

    C# Socket多线程编程开发

    从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据...

    C# 2.0 套接字编程实例初探.pdf

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的...

    浅谈C#网络编程详解篇

    在网络编程中分客户端和服务端两种角色,比如通过打开浏览器访问到挂在Web软件上的网页,从程序角度上来看,即客户端(浏览器)发起了一个Socket请求到服务器端,服务器把网页内容返回到浏览器解析后展示。在客户端和...

    C#套接字编程实例_UDP_TCP通信源码实例

    首先从原理上解释一下采用Socket 接口的网络通讯,这里以最常用的 C/S 模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来 连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按...

    局域网监控系统的开发

    本文首先介绍了可以实现局域网监控基础Socket编程的基本概念及其调用的方法,多线程的相关概念及套接字的使用方法,接着从建立Socket套接字开始,完成各功能模块的系统实施,主要包括从鼠标锁定,到关机,到时时截屏...

    即时通信工具(Microsoft Visual Studio 2005 + SQL Service 2000)

    ①主要功能模块: 开发此系统的需求源于:用户与用户之间点对点的交流,信息传送,文件共享。 该系统包含服务端与客户端 ... 该系统用的是C/S架构,MVC三层设计模式 ,里面主要用到了Socket编程以及多线程。

    一种基于Java企业内部及时通讯软件设计.doc

    一种基于Java企业内部及时通讯软件设计 摘要:基于Socket的局域网通讯软件能为企业局域网提供一种安全、快速的通信机制, 使用Java Swing 技术设计系统界面,以Derby作为数据库服务器,用Socket编程技术实现网络通讯...

    NetWorkHomeWork:计算网络作业

    NetWorkHomeWork 计算机网络作业 初次涉及网络编程,多有不足之处。 题目一: 实现最基础的Socket...客户端可请求服务端可以提供的文件列表,客户端请求服务端的某个文件,服务端将该文件传输给客户端保存 服务器端:

    SpellCorrect:拼写纠错程序,涉及建词典、索引,动态规划算法,线程池池,线程同步,socket网络编程等

    客户端请求,将客户端请求词封装成任务,再用锁机制 将任务添加到线程池中的任务队列中。工作线程通过互 斥量和条件变量访问任务队列,实现线程同步,使得线 程池有序工作。 每个工作线程独立完成自己的任务:到...

Global site tag (gtag.js) - Google Analytics