import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; /**
* User: HYY
* Date: 13-10-29
* Time: 下午9:57
* To change this template use File | Settings | File Templates.
*/
public class Server { public static final int SERVER_PORK = 10000; public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket serverSocket = new ServerSocket(SERVER_PORK);
System.out.println("正在监听 " + SERVER_PORK + " 端口!");
Socket socket;
BufferedReader bufferedReader;
while (true) {
socket = serverSocket.accept();
System.out.println("一客户端连接。");
Thread writerThread = new Thread(new MyServerWriter(socket));
writerThread.start(); bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
try {
String msg;//客户端发过来的信息
while ((msg = bufferedReader.readLine()) != null) {
System.out.println("##客户端:" + msg);
}
} catch (IOException e) {
try {
if (!socket.isClosed()) {
socket.close();
}
} catch (IOException e1) {
System.out.println("关闭socket出现错误");
}
}
System.out.println("提示:当前客户端已经断开连接,服务器正等待下一个客户端的连接。");
}
}
} class MyServerWriter implements Runnable {
private Socket socket = null;
private PrintWriter printWriter;
private Scanner scanner; public MyServerWriter(Socket socket) throws IOException {
this.socket = socket;
scanner = new Scanner(System.in);
printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
} @Override
public void run() {
String msg;//要发送的信息
try {
while ((msg = scanner.nextLine()) != null) {
if (msg.equals("88")) {
if (!socket.isClosed()) {
System.out.println("服务器手动与客户端断开");
socket.close();
}
break;
}
printWriter.println(msg);
}
} catch (IOException io) {
System.out.println("关闭socket出现问题");
} catch (Exception e) {
System.out.println("异常关闭客户端(可能是直接关闭退出窗口)");
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner; /**
* Created with IntelliJ IDEA.
* User: HYY
* Date: 13-10-29
* Time: 下午10:31
* To change this template use File | Settings | File Templates.
*/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 10000);
System.out.println("连接服务器成功!如果想断开连接请输入88(回车)");
new Thread(new MyClientWriter(socket)).start(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
try {
String msg;//服务器发过来的信息
while ((msg = bufferedReader.readLine()) != null) {
System.out.println("##服务器:" + msg);
}
} catch (IOException e) {
System.out.println("警告:断开连接!");
try {
if (!socket.isClosed()) {
socket.close();
}
} catch (IOException e1) {
System.out.println("读取线程:关闭socket出现错误");
}
}
System.exit(1);
}
} class MyClientWriter implements Runnable{
private Socket socket = null;
private PrintWriter printWriter;
private Scanner scanner; public MyClientWriter(Socket socket) throws IOException {
this.socket = socket;
scanner = new Scanner(System.in);
printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
} @Override
public void run() {
String msg;//要发送的信息
try {
while ((msg = scanner.nextLine()) != null) {
System.out.println("isClosed="+socket.isClosed());
if(socket.isClosed()) {
break;
} else {
if(msg.equals("88")) {
break;
}
}
printWriter.println(msg);
}
} catch (Exception e) {
// System.out.println("异常关闭客户端(可能是直接关闭退出窗口)");
}
System.out.println("写线程准备死亡");
}
}

Java使用socket实现两人聊天对话的更多相关文章

  1. java swing+socket实现多人聊天程序

    swing+socket实现多人聊天程序 1.准备工作 先看效果: 客户端项目结构图: 服务端项目结构图: 2.运行原理 服务端 先开一个线程serverListerner,线程中开启一个Server ...

  2. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  3. 多线程+socket实现多人聊天室

    最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消 ...

  4. 基于Socket实现多人聊天室

    当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...

  5. java-网络通信--socket实现多人聊天(基于命令行)

    先编写最简答的服务器 思路 1编写一个实现Runnable接口的静态内部类 ServerC,便于区分每个客户端 1.1 获取客户端数据函数 public String remsg() 1.2 转发消息 ...

  6. Java 多线程Socket编程通讯--实现聊天室代码

    1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...

  7. java版两人聊天程序

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  8. 【Java】Socket+多线程实现控制台聊天室

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端 ...

  9. java NIO 实例之多人聊天

    关键抽象 1.定义一个HashMap<String,SocketChannel>用户存储每个用户的管道. 2.服务端监听read事件,获取消息后轮询hashmap发送消息给用户模型内的所有 ...

随机推荐

  1. 为什么margin-top不是作用于父元素

    为什么margin-top不是作用于父元素:建议:尽可能的手写代码,可以有效的提高学习效率和深度.至于margin-top属性的基本用法再简单不过,那就是设置一个对象的上外边距,看下面的代码实例: & ...

  2. 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理

    [转]PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理 只要有人用了: select t.* from ...

  3. JDBC与ODBC的区别与应用

    jdbc是使用通过JAVA的数据库驱动直接和数据库相连,而jdbc-odbc连接的是ODBC的数据源,真正与数据库建立连接的是ODBC! 建议使用JDBC直接连接,同时最好使用连接池! JDBC 是 ...

  4. asp下实现多条件模糊查询SQL语句

    常写一个简单的模糊查询的SQL语句格式可以如下例: sql="select * from 表名 where 字段名 like ’%" & request.form(&quo ...

  5. Java内存溢出的详细解决方案

    本文介绍了Java内存溢出的详细解决方案.本文总结内存溢出主要有两种情况,而JVM经常调用垃圾回收器解决内存堆不足的问题,但是有时仍会有内存不足的错误.作者分析了JVM内存区域组成及JVM设置虚拟内存 ...

  6. Windows8安装Oracle11.2.0.1-0624,附带 DBCA建库、netca创建监听、配置PLSQL、定义客户端的环境变量 NLS_LANG、定义客户端的环境变量 TNS_ADMIN01

    Windows8安装Oracle11.2.0.1                                         操作系统:Windows 8 企业版 64bit Oracle:11. ...

  7. 纯代码添加约束条件(Auto Layout)

    Auto Layout 是一种基于约束的.描述性的布局系统.也就是使用约束条件来描述布局,View的Frame会根据这些描述来进行计算. 在iOS6.0以后加入了一个新类: NSLayoutConst ...

  8. jquery的effect-color对easyui没效果.自己冒险写个边框的颜色闪烁.

    "jquery-ui-effect-color.js" 是从jqueryui下载的color动画部分(自己改了个名字). 链接 <!DOCTYPE html> < ...

  9. 05_XML的解析_01_dom4j 解析

    [简述] Xml文件出了给开发者看,更多情况使用程序读取xml文件里的内容,这叫做xml解析. 根据解析方式分为:DOM解析 和 SAX解析 [解析工具] (一). 使用DOM解析原理的工具: 1.J ...

  10. [翻译][MVC 5 + EF 6] 9:异步和存储过程

    原文:Async and Stored Procedures with the Entity Framework in an ASP.NET MVC Application 1.为什么使用异步代码: ...