应用java多线程实现server端与多client之间的通信
应用多线程来实现server与多线程之间的通信的基本步骤
1、server端创建ServerSocket,循环调用accept()等待client链接
2、client创建一个Socket并请求和server端链接
3、server端接受client请求,创建socekt与该client建立专线链接
4、建立链接的socket在一个单独的线程上对话
5、server继续等待新的链接
package test.concurrent.socket; import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* Created by dong on 15-6-22.
* 基于TCP协议的Socket通信。实现用户登录
* 服务器端
*/
public class Server { public static void main(String[] args) { try {
//1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
//记录client的数量
int count = 0;
System.out.println("***服务器即将启动,等待client的链接***");
//循环监听等待client的链接
while (true){
//调用accept()方法開始监听,等待client的链接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start(); count++; //统计client的数量
System.out.println("client的数量: " + count);
InetAddress address = socket.getInetAddress();
System.out.println("当前client的IP : " + address.getHostAddress());
} } catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端线程处理类ServerThread.java
package test.concurrent.socket; import java.io.*;
import java.net.Socket; /**
* Created by dong on 15-6-22.
* server端线程处理类
*/
public class ServerThread extends Thread { //和本线程相关的Socket
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
} //线程运行的操作,响应client的请求
public void run(){ InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null; OutputStream os = null;
PrintWriter pw = null;
try { //获取一个输入流,并读取client的信息
is = socket.getInputStream();
isr = new InputStreamReader(is); //将字节流转化为字符流
br = new BufferedReader(isr); //加入缓冲
String info = null;
//循环读取数据
while ((info = br.readLine()) != null){
System.out.println("我是server。client说: " +info);
} socket.shutdownInput(); //关闭输入流 //获取输出流。响应client的请求
os = socket.getOutputStream();
pw = new PrintWriter(os); //包装为打印流
pw.write("欢迎你");
pw.flush(); //将缓存输出 } catch (IOException e) {
e.printStackTrace();
}finally { try {
//关闭资源
if (pw != null)
pw.close();
if (os != null)
os.close();
if (is != null)
is.close();
if (isr != null)
isr.close();
if (br != null)
br.close();
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace(); } } }
}
clientClient.java
package test.concurrent.socket; import java.io.*;
import java.net.Socket; /**
* Created by dong on 15-6-22.
* client
*/
public class Client { public static void main(String[] args) { try {
//1、创建clientSocket,指定server端口号和地址
Socket socket = new Socket("localhost",8888);
//2、获取输出流,向server发送信息
OutputStream os = socket.getOutputStream(); //字节输出流
PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流
pw.write("username:tom; password:456");
pw.flush();
socket.shutdownOutput(); //关闭输出流 InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr); String info = null;
//循环读取
while ((info = br.readLine()) != null){
System.out.println("我是client:server说:" + info);
} br.close();
is.close();
isr.close(); pw.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
应用java多线程实现server端与多client之间的通信的更多相关文章
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- server端获得到client端的IP地址的格式
使用telnet,ping或其他client连接server端时,server端获得的client端的ip地址取决于client端使用的时ipv4还是ipv6地址. 例: client IPv4地址: ...
- 搜集的一些RTMP项目,有Server端也有Client端
查询一些RTMP的协议封装时找到了一些RTMP开源项目,在这里列举一下,以后有时间或是有兴趣可以参考一下: just very few of them. Red5 only contains a se ...
- Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html 一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...
- JAVA多线程提高四:多个线程之间共享数据的方式
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...
- HBase 协处理器编程详解第一部分:Server 端代码编写
Hbase 协处理器 Coprocessor 简介 HBase 是一款基于 Hadoop 的 key-value 数据库,它提供了对 HDFS 上数据的高效随机读写服务,完美地填补了 Hadoop M ...
- JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- [转] JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- 【多线程】JAVA多线程和并发基础面试问答(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
随机推荐
- C Traps and Pitfallss
第一章 词法“陷阱” 发送阿罡发公司阿发送个发送阿罡发公司阿发送个 第二章
- JNDI support differences between Tibco EMS and ActiveMQ
Introduction Recently our team was working on Veracity Quick Start sprint, when I was trying to migr ...
- 论山寨手机与Android联姻 【6】MTK手机的基带芯片
MTK的硬件技术的核心,在于它的基带芯片.为了降低成本,同时缩减手机主板的面积,基带芯片中除了CPU以外,还集成了很多外设控制器.Feature Phone的功能,基本上取决于基带芯片所支持的外设功能 ...
- 【POJ】2318 TOYS ——计算几何+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10281 Accepted: 4924 Description ...
- ByteBuffer用法总结
转自:http://blog.csdn.net/mars5337/article/details/6576417 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChanne ...
- wx.Notebook
wx.Notebook This class represents a notebook control, which manages multiple windows with associated ...
- C# DataTable几个常用的查询表达式【转】
DataTable dt = GetDetails().Tables[0]; //获取可用的DataTable // var m = dt.AsEnumerable().Last ...
- 重写系统中的UINavigationController返回按钮的事件
1.扩展UIviewController UIViewController+BackButtonHandler.h #import <UIKit/UIKit.h> @protocol Ba ...
- 共享器 TS ERROR WINDOWS-FAILED 错误解决方法
问题:TS ERROR WINDOWS-FAILED 原因:微软操作系统自动更新补丁(KB956572)与终端机软件有冲突. 解决方法: .打开“开始菜单”: .打开“控制面板”: .打开“添加/删 ...
- jquery ajax 参数可以序列化
<form> <input type="text" name="FirstName" value="Bill" /> ...