先说一下大概的思路:

  应用多线程来实现服务器与多客户端之间的通信

  1、服务器端创建ServerSocket,循环调用accept()等待客户端连接;

  2、客户端创建一个Socket并请求与服务器端连接;

  3、服务器端接受客户端请求,创建Socket与该客户端简历专线连接;

  4、建立连接的两个Socket在一个单独的线程上对话;

  5、服务器端继续等待其他新的连接。

  闲话不多说,直接上代码:

package net;
/**
* 1、客户端
*/ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try {
//1、创建Socket,与服务器建立连接
Socket socket = new Socket("localhost", 8889);
//2、向服务器端发送消息
OutputStream os = socket.getOutputStream();
PrintWriter pwriter = new PrintWriter(os); //将Socket的输出字节流包装成打印流
pwriter.write("用户名:sysker ; 密码:sys154"); //刷新流
pwriter.flush();
//3、关闭资源
socket.shutdownOutput(); //3、获取输入流
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String getMsage=null;
while((getMsage=bufferedReader.readLine())!=null){
System.out.println("客户端正在等待响应,服务器说:"+getMsage); } //socket.shutdownInput();
bufferedReader.close();
inputStream.close();
inputStreamReader.close();
pwriter.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

package net;
/**
* 2、服务器端
*/ import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class ManyClientServer { public static void main(String[] args) {
Socket socket = null;
int clientCount = 0;
try {
ServerSocket serverSocket = new ServerSocket(8889);
while(true){
socket = serverSocket.accept();
ManyClientThread manyClientThread = new ManyClientThread(socket);
manyClientThread.start();
clientCount++;
System.out.println("客户端数量"+clientCount);
System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

package net;
/**
* 3、服务器通信线程
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket; public class ManyClientThread extends Thread{
Socket socket = null;
BufferedReader bufferedReader = null;
public ManyClientThread(Socket socket){
this.socket = socket;
}
public void run(){
try {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String mString = null;
while((mString = bufferedReader.readLine())!=null){
System.out.println("我是服务器,客户端说"+mString);
}
bufferedReader.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(bufferedReader!=null){
try {
bufferedReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }
}
												

最新文章

  1. 作为前端应当了解的Web缓存知识
  2. 面试题目——《CC150》树与图
  3. CSDN数据库被爆 统计CSDN用户都喜欢哪些密码
  4. mysql 命令管理
  5. IOS 7 UI 的适配
  6. NET MVC1项目升级到MVC2最简单的方法
  7. Wince 文本函数和字体应用
  8. NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
  9. IOS 表视图(UITableVIew)的使用方法(5)表视图的编辑功能(删除)
  10. java实现文件夹(包括其中的子文件夹、子文件)的复制——递归
  11. HDU - 3038 种类并查集
  12. MyBatis在非Spring环境下第三方DataSource设置-Druid篇
  13. Kotlin入门(24)如何自定义视图
  14. Confluence 6 配置管理员会话安全的备注
  15. virsh命令和虚拟机克隆
  16. OneZero第二周第四次站立会议(2016.3.31)
  17. 继承自NSObject的不常用又很有用的函数(1)
  18. Python3之外部文件调用Django程序操作model等文件实现
  19. ODI---->Variables
  20. 【Mysql】Fedora下 Mysql 安装及配置

热门文章

  1. sqlserver 函数里并返回一个表格数据拼接的字符串
  2. JS使用模板快速填充HTML控件数据
  3. 实现stack 加上·getMin功能 时间复杂度为O(n)
  4. Session 和cookie机制详解
  5. Java 实现 JS的eval函数
  6. Linux Shell 判断块设备节点是否存在
  7. freeMarker(九)——程序开发指南补充知识
  8. luogu1336 最佳课题选择
  9. 使用TortoiseGit来访问GitHub
  10. unittest ,ddt数据驱动,读取文件中数据,多个参数时的处理