应用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 ...
随机推荐
- 解决Eclipse下第三方库无法导航源代码
写在前面(的废话):Eclipse无法导航代码,存在的可能性非常多,这里我们只讨论在引用第三方库时无法导航的情况,是一个很简单的Case,但是搜索能力好像不太及格,没找到一针见血的方案,于是自己研究了 ...
- SQL Server 改变数据库的名字
方法 1: alter database modiry name = new_database_name; ---------------------------------------------- ...
- 设置windows窗口半透明(使用SetLayeredWindowAttributes API函数)
所需函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd, COLORREFcrKey, BYTE bAlpha, DWORD flag); ...
- C语言入门(15)——结构体与数据抽象
大多数的计算机运算是对现实世界的模拟,如果想用计算机来模拟现实世界需要用到数据抽象的方法.所谓抽象是从实际的人.物.事和概念中抽取所关心的共同特征,,忽略非本质的细节,吧这些特征用各种概念精确的加以描 ...
- windows和linux下获取当前程序路径以及cpu数
#ifdef WIN32 #include <Windows.h> #else #include <stdio.h> #include <unistd.h> #en ...
- jsxtransformer.js 和browser.js有什么关系?
这个确实是百度就能解决的问题 补充下楼上的回答在react 0.14前,浏览器端实现对jsx的编译依赖jsxtransformer.js 在react 0.14后,这个依赖的库改为browser.js ...
- 跟我一起学extjs5(24--模块Form的自己定义的设计[2])
跟我一起学extjs5(24--模块Form的自己定义的设计[2]) 在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcont ...
- JAVA-反射-getGenericSuperclass()
1 public class Person<T> { 2 3 } 4 5 import java.lang.reflect.ParameterizedType; 6 import java ...
- Oracle表管理
/*-----------------------创建和管理表-----------------------------*/一.Orcale之中的数据类型:1.NUMBER.DATE.VARCAHR. ...
- 常用的ASCII码对照表