应用多线程来实现server与多线程之间的通信的基本步骤

1、server端创建ServerSocket,循环调用accept()等待client链接

2、client创建一个Socket并请求和server端链接

3、server端接受client请求,创建socekt与该client建立专线链接

4、建立链接的socket在一个单独的线程上对话

5、server继续等待新的链接

server端Server.java
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之间的通信的更多相关文章

  1. java多线程通过管道流实现不同线程之间的通信

    java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...

  2. server端获得到client端的IP地址的格式

    使用telnet,ping或其他client连接server端时,server端获得的client端的ip地址取决于client端使用的时ipv4还是ipv6地址. 例: client IPv4地址: ...

  3. 搜集的一些RTMP项目,有Server端也有Client端

    查询一些RTMP的协议封装时找到了一些RTMP开源项目,在这里列举一下,以后有时间或是有兴趣可以参考一下: just very few of them. Red5 only contains a se ...

  4. Java多线程之线程的状态以及线程间协作通信导致的线程状态转换

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html  一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...

  5. JAVA多线程提高四:多个线程之间共享数据的方式

    多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 如果每个线程执行的代码不同,这 ...

  6. HBase 协处理器编程详解第一部分:Server 端代码编写

    Hbase 协处理器 Coprocessor 简介 HBase 是一款基于 Hadoop 的 key-value 数据库,它提供了对 HDFS 上数据的高效随机读写服务,完美地填补了 Hadoop M ...

  7. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  8. [转] JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. 【多线程】JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

随机推荐

  1. EditPlus自动执行出结果设置

  2. VS2010+Visual Assist X

    以前一直用VC++6.0,配一个VA,感觉也挺好用的.今天安装了VS2010,感觉还是有点不适应.然后安装了一个 Visual Assist X,主要是VS2010下破解VA有点小麻烦,中途也出现了一 ...

  3. 用程序对hdfs进行操作。

    调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中运行的. 运行命令Java -jar  XXX.jar. 当中对hdfs的操作 ...

  4. .NET程序员生活开始

    不知不觉,开始踏入程序员生活了!加油吧.有关Session的好文章: 最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错, ...

  5. js基础——属性操作

    html属性:属性名——属性值 操作:读 . 写 读操作:用来获取.找到属性名对应的属性值,方法:元素.属性名 例如:var oBtn = document.getElementById('btn1' ...

  6. poj 2771 最大独立集

    这道题又无耻的抄袭了别人的代码. 刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集. 最大独立集=|G| ...

  7. JavaWeb核心编程之(三.2)Servlet配置

    Servlet配置 1.配置Serlvet加载时机 2.配置多映射 配置加载时机 新建项目config->创建包com.xiaoan.config->创建类FirstServlet imp ...

  8. phpcms-v9 前台模板文件中{pc}标签的执行流程

    前台pc标签的使用:{pc:content 参数名="参数值" 参数名="参数值" 参数名="参数值"} 如: {pc:content ac ...

  9. 图片压缩上传 Android

    图片压缩的话 想保持 图像清晰度,但是又想保持图片的大小在100k左右. 同时的话又不想自己写那些压缩的代码的话.那你就找对地方了. 提供一个思路. 先读取你的文件,然后读到bitmap里面进行尺寸裁 ...

  10. <转>eclipse如何修改dynamic web module version .

         --------------------------------------------------------------------------------------------- 原 ...