应用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 ...
随机推荐
- ASP.net MVC3里的HandleErrorAttribute
在MVC3里使用HandleErrorAttribte类,有2种方式可以使用它,一是在类或者方法上直接使用HandleError属性来定义: // 在这里声明[HandleError]public c ...
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)
本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...
- Linux网桥
linux网桥的功能 转发数据包 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除.网桥对站点所处网段的了解是靠"自学习&q ...
- JavaScript 的DOM操作
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. Windows 对象操作 ...
- PHP自学1——简单表单提交
最近自学PHP,顺便做个笔记记录一下自己的学习进度.选用的教程是<PHP and MySQL Web Development 4th Edition>,建议阅读英文教材(我能说英文网上免费 ...
- Windows Server 2008 安装好之后的简单配置
1.禁用密码复杂度 在运行中输入GPEDIT.MSC 打开组策略,找到计算机配置->Windows设置->安全设置->账户策略中的密码策略,将“密码必须符合复杂性要求”设置为禁用即可 ...
- org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session
出错原因很简单:数据库服务没开,自然就打不开Session了.
- Python核心编程读笔 4
第五章 数字 二.整形 1 布尔型 2 标准整数类型 3 长整型 数字后面加L,能表示非常非常大的数字 目前,整形和长整型逐渐统一!!! 三.双精度浮点数 四.复数 有关复数的几个概念: 表示虚数的语 ...
- OC语法2——OC的类,方法,成员变量的创建
类的创建: 与Java不同的是,OC创建一个类需要两个文件(.h和.m文件) 1> xxx.h:声明文件.用于声明成员变量和方法.关键字@interface和@end成对使用. 声明文件只是声明 ...
- php 7 正式发版
php 7 正式发版 php 在 2015年 12月 3 日 正式发布了 php7 以下是php7的新特性 性能是php5.6的2倍 显著的减少了内存的使用 抽象语法书 64位的支持 提高了异常层次 ...