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. PHP之curl

    当我第一次接触curl的时候,看文档,以及网上search各种资料,官方(http://cn2.php.net/manual/en/intro.curl.php)的解释是,这是某大牛写的一个libcu ...

  2. nopCommerce添加支付插件

    之前完成了nopCommerce和汉化以及配置,今天继续对nopCommerce的研究,为了能够完成购物,我们就要将伟大的支付宝添加至其中了.支付宝插件下载 将Nop.Plugin.Payments. ...

  3. java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常总结

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常总结 做android开发的可能都碰到"j ...

  4. Android之 Fragment

    什么是Fragment: Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局, ...

  5. ReactiveCocoa入门教程——第一部分(转)

    作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...

  6. OC3_字符串分割

    // // main.m // OC3_字符串分割 // // Created by zhangxueming on 15/6/11. // Copyright (c) 2015年 zhangxuem ...

  7. 高能物理/HyperPhysics的网站/Website

    参考: 基础物理-高能物理[Hyperphysics]

  8. enum 与 #define

    enum 与 #define 一.为什么既要有enum,又要define enum is derived from enumerate, from ex- + number,字面意思就是用数字排列,报 ...

  9. 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3555111.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  10. DOM五大对象

    1.Window 对象:Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个 ...