Java Socket实战之二:多线程通信
上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。
具体代码如下:
- packagecom.googlecode.garbagecan.test.socket.sample2;
-
importjava.io.BufferedReader;
-
importjava.io.IOException;
-
importjava.io.InputStreamReader;
-
importjava.io.PrintWriter;
-
importjava.net.ServerSocket;
-
importjava.net.Socket;
-
publicclassMyServer{
-
publicstaticvoidmain(String[]args)throwsIOException{
-
ServerSocketserver=newServerSocket(10000);
-
-
while(true){
- Socketsocket=server.accept();
- invoke(socket);
- }
- }
-
-
privatestaticvoidinvoke(finalSocketclient)throwsIOException{
-
newThread(newRunnable(){
-
publicvoidrun(){
-
BufferedReaderin=null;
-
PrintWriterout=null;
-
try{
-
in=newBufferedReader(newInputStreamReader(client.getInputStream()));
-
out=newPrintWriter(client.getOutputStream());
-
while(true){
- Stringmsg=in.readLine();
- System.out.println(msg);
-
out.println("Serverreceived"+msg);
- out.flush();
-
if(msg.equals("bye")){
-
break;
- }
- }
-
}catch(IOExceptionex){
- ex.printStackTrace();
-
}finally{
-
try{
- in.close();
-
}catch(Exceptione){}
-
try{
- out.close();
-
}catch(Exceptione){}
-
try{
- client.close();
-
}catch(Exceptione){}
- }
- }
- }).start();
- }
- }
下面是Client程序代码:
- packagecom.googlecode.garbagecan.test.socket.sample2;
-
importjava.io.BufferedReader;
-
importjava.io.InputStreamReader;
-
importjava.io.PrintWriter;
-
importjava.net.Socket;
-
publicclassMyClient{
-
publicstaticvoidmain(String[]args)throwsException{
-
Socketsocket=newSocket("localhost",10000);
-
BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));
-
PrintWriterout=newPrintWriter(socket.getOutputStream());
-
BufferedReaderreader=newBufferedReader(newInputStreamReader(System.in));
-
while(true){
- Stringmsg=reader.readLine();
- out.println(msg);
- out.flush();
-
if(msg.equals("bye")){
-
break;
- }
- System.out.println(in.readLine());
- }
- socket.close();
- }
- }
测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。
原文链接:http://blog.csdn.net/kongxx/article/details/7259465
分享到:
相关推荐
NULL 博文链接:https://yangliuwillow.iteye.com/blog/1544038
外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式,通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的,而Java提供的多线程功能,用...
( Java Swing+ Derby+多线程+ Socket编程实现)。 近年来,随着中、小型企业的蓬勃发展,各种企业内部通信系统也在飞速发展着。由于企业内部通信系统可以不用链接 Internet,直接在局域网内实现信息通信、工作交流和计划...
同时,课程还涉及了多线程编程、Socket编程、GUI设计等技术,并使用了Swing等工具进行界面设计。 3. **课程内容**:课程内容涵盖了聊天室的整个开发流程,从需求分析、系统设计到代码实现和测试部署等环节。学员将...
* 深入分析了Java网络编程的关键技术,如Socket通信、多线程处理等,并通过实例进行了验证。 * 全面介绍了系统的架构设计、功能模块划分以及数据库设计,展现了系统的高度模块化与可扩展性。 * 对系统的实现过程进行...
第1篇 Java开发必备基础 第1章 搭建Java开发环境 1.1 Java的过去、现在和未来 1.1.1 Java的历史 ...第31章 俄罗斯方块游戏网络版(Swing+多线程+网络编程) 31.1 俄罗斯方块游戏项目原理 31.1.1 基本原理 ...
第8章Java的多线程机制266 8.1线程的概念266 8.1.1多线程的特点266 8.1.2线程的状态267 8.2Thread类268 8.2.1Thread类的构造方法268 8.2.2Thread类的常用方法268 8.3多线程程序的编写269 8.3.1利用Thread的...
精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会游戏软件分会(CGIA)认证及国际游戏开发教育联合会国际认证。曾经领导和参与...
杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...
8.3 Socket通信 8.3.1 Socket基础 8.3.2 Socket应用(简易聊天室) 8.4 网络通信的中文乱码问题 8.5 WebKit应用 8.5.1 WebKjt概述 8.5.2 WebView浏览网页 8.5.3 WebView与Java 8.6 WtFi介绍 8.7 蓝牙 8.8 小结 第9章 ...