应用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 ...
随机推荐
- 矩阵转置 O(1)空间
题目:用O(1)的空间实现矩阵的转置 为了方便,使用一维数组来分析.所谓矩阵转置,行变列,列变行.在转置的过程中,有的元素位置是不变的:对于变化位置的元素,要求O(1)空间完成,那么这些位置的变化一定 ...
- C语言的本质(8)——副作用与顺序点
C 语言中,术语副作用是指对数据对象或者文件的修改.例如以下语句 var = 99; 的副作用是把 var 的值修改成 99.对表达式求值也可能产生副作用,例如: se = 100 对这个表达式求值所 ...
- AOJ 2200 Mr. Rito Post Office(Floyd+单调DP)
[题目链接] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2200 [题目大意] 一张图中有陆路和水路,水路必须要有船才能走,当船 ...
- 【POJ】2318 TOYS ——计算几何+二分
TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10281 Accepted: 4924 Description ...
- ubuntu下tcpdump使用
Ubuntu默认是安装好了tcpdump工具的,如果没有安装的话使用sudo apt-get install tcpdump即可安装. (如果遇到tcpdump: no suitable devi ...
- Hibernate 、多表关联映射-组件关联映射(component)
组件关联映射可以将一些简小的数据与主题放在一个表中,例如firstName 和LastName这两个结合在一起可以组成一个名字,但是再分别将这两个再建一个表就不太合适了,这个时候可以用到组件关联映射: ...
- Android UI ActionBar功能-在 Action Bar 上添加按钮
在ActionBar上添加按钮实现某些功能最常见的Application的功能如:在ActionBar上添加一个搜索按钮: 首先官方文档说明:http://wear.techbrood.com/tra ...
- The MySQL C API 编程实例
在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...
- Android常用控件之Fragment仿Android4.0设置界面
Fragment是Android3.0新增的概念,是碎片的意思,它和Activity很相像,用来在一个Activity中描述一些行为或部分用户界面:使用多个Fragment可以在一个单独的Activi ...
- OAuth2 for asp.net web api
在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. https://github.com/DotNetOpenAuth http://www.cnb ...