先说一下大概的思路:

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

  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();
}
} } }
}
												

java学习笔记——Java多客户端与服务器通信的更多相关文章

  1. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  2. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  3. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  4. (Java学习笔记) Java Networking (Java 网络)

    Java Networking (Java 网络) 1. 网络通信协议 Network Communication Protocols Network Protocol is a set of rul ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. 我的Java学习笔记-Java面向对象

    今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...

  7. java学习笔记----java入门

    java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...

  8. Java学习笔记-Java概述和环境配置

    基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...

  9. Java学习笔记-Java中的常用类

    Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...

随机推荐

  1. 前段验证框架 formValidator

    http://blog.csdn.net/lorinzhang/article/details/7283557

  2. 【转】Linux目录下/dev/shm的理解和使用

    一般来说,现场部署  都要根据内存的大小来设定/dev/shm的大小,大部分使用的是默认的值! Linux目录下/dev/shm的理解和使用 [日期:2014-05-16] 来源:Linux社区  作 ...

  3. 【MongoDb基础】插入数据

    以mydb为事例数据库. 切换到mydb数据库. use mydb 1. insert函数. db.users.insert({name:"Derek",age:18}) 该函数会 ...

  4. Swoole:重新定义PHP

    Swoole PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异 ...

  5. Chrome调试大全

    作为一名前端开发者,打交道最多的可能是和浏览器.市面上各种浏览器多不胜数,主流的有Chrome,Firefox,Safari,IE,Opera,非主流的如360,遨游,QQ浏览器,搜狗浏览器,据说淘宝 ...

  6. WPF实现多值绑定特性以及多值转换

    WPF中的实现 我们首先来看一下常规的绑定 <Window    x:Class="WpfApplicationSample.MainWindow"    xmlns=&qu ...

  7. Bootstrap入门(十)组件4:按钮组与下拉菜单结合

    Bootstrap入门(十)组件4:按钮组与下拉菜单结合   先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) < ...

  8. Myeclipse8.5 反编译插件 jad 安装(转)

    准备工作 下载jad.exe文件:http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip 下载jadeclipse插件:ht ...

  9. Swift资料大全

    简单看了一下swift的语法,个人感觉相对于object-c很是简单明了.Swift的出现并不能说明iOS开发简单了很多,有可能会变得复杂,你需要学习两门编程语言,因为在程序员的世界里,务实并不是最重 ...

  10. 在C++中反射调用.NET(一)

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编 ...