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. foo,bar,baz

    https://en.wikipedia.org/wiki/Foobar 原文: The terms foobar, foo, bar, baz and qux are sometimes used ...

  2. Android——获取网络图片

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  3. 初学android:四大组件之contentprovider

    一.ContentProvider的概念ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见的一些数据提供了默认的ContentP ...

  4. Extjs搜索域使用

    要在使用的panel在预先加载搜索域类requires : ["Ext.ux.form.SearchField"],

  5. 修改Latex常用编辑器WinEdt中的字号与字体 [转]

    用latex编写科技文章已经是大多数科研工作者采用的方法,其编写效果是word所远不能及的.但是其效果只是在编译之后,之前文字那弱小的身躯确实令很多人无奈.10Pt的字体在以前14寸的电脑上看起来还是 ...

  6. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法

    阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...

  7. CAF(C++ actor framework)使用随笔(send sync_send)(二)

    a). 发完就忘, 就像上面anon_send 以及send #include <iostream> #include "caf/all.hpp" #include & ...

  8. 学习C++ Primer 的个人理解(十二)

    动态内存与智能指针 在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针 用delete来销毁. 由于手动的对动态内存进行操作容易出现问题.所以新的标准库提供了两种智能指针. 智能指针 ...

  9. [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)

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

  10. c++实现类似Common Lisp的多参数加法和比较

    在CL里我们可以这样: $ sbcl * (+ 1 2 3) 6 * (< 1 2 3) T * (< 2 3 1) NIL * 从简单的方面看, CL的+和<就是一个接收多参数的函 ...