目的:实现多个客户之间的通信

首先,这个聊天器的框架是这样的:

对于服务器端:建立socket,连接到服务器,并且开始监听。

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.net.*;
public class MultiTalkServer{
static int clientnum = 0;
//创建一个arraylist数组来保存socket,
public static List <Socket> socketList = new ArrayList <Socket>();
public static void main(String args[])throws IOException{
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket= new ServerSocket(4700);
System.out.println("欢迎来到聊天室。");
}catch(IOException e) {
System.out.println("Could not listen on port:4700.");
System.exit(-1);
}
while (listening) {
clientnum++;
Socket st = serverSocket.accept();//先创建一个socket
//此处会阻塞,等待接收
socketList.add(st);//将这个线程添加到list里
System.out.println("上线通知: 用户" + clientnum+"上线啦!");
new ServerThread(st,clientnum).start();//再创建一个服务端线程
}
serverSocket.close();
}
}

服务器线程:

import java.io.*;
import java.net.*;
public class ServerThread extends Thread{
Socket socket = null;//服务器的套接字
int clientnum;
String line;
//将line定义在外面
public ServerThread(Socket socket,int num){
this.socket=socket;
clientnum=num+1;
}
public void run() {
try {
BufferedReader is = new BufferedReader(new
InputStreamReader(socket.getInputStream()));//is:从缓存区读入 PrintWriter os = new PrintWriter(socket.getOutputStream());//os:从缓存区输出 BufferedReader sin = new BufferedReader(
new InputStreamReader(System.in));//系统标准输入 System.out.println("Client:"+clientnum+is.readLine());//显示从客户端读入的对象,在这里等待客户端输入 line=sin.readLine();
//前面是初始化
while(!line.equals("bye")) {
os.println(line);//向客户端输出该字符串
os.flush();//刷新,让客户端接收到
System.out.println("Server:"+line);//显示服务端读入的字符
System.out.println("Client:"+clientnum+is.readLine());//再次从客户端读入字符串
line=sin.readLine();//从服务端读入字符
}
os.close();
is.close();
socket.close(); }catch(Exception e) {
System.out.println("Error:"+e);
}
}
}

客户端:

import java.net.*;
import java.io.*;
public class TalkClient{ public static void main(String args[]){
try {
Socket socket = new Socket("127.0.0.1",4700);
System.out.print("已连接成功,");
new Thread(new ClientThread(socket)).start();
new Thread(new ClientThread2(socket)).start();
}catch(Exception e) {
System.out.println("Error"+e);
} }
}

客户端线程1:

import java.io.*;
import java.net.*;
public class ClientThread extends Thread{
Socket socket;
String line;
public ClientThread(Socket socket) {
this.socket = socket; }
public void run(){
try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
while(true) {
line = is.readLine();
out.println(line); //向服务器输入;
out.flush();
}
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}

客户端线程2:

import java.io.*;
import java.net.*;
public class ClientThread2 extends Thread{
Socket socket; public ClientThread2(Socket socket) {
this.socket = socket;
}
public void run(){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true) {
String line = in.readLine();
System.out.println(line);
}
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}

展示结果:

java socket通信:聊天器(1)的更多相关文章

  1. windows phone 8.1开发:socket通信聊天

    本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...

  2. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  3. java socket通信-传输文件图片--传输图片

    ClientTcpSend.java   client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...

  4. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  5. Java Socket通信读取相关信息代码

    转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...

  6. Java Socket通信以及可能出现的问题解决

    Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...

  7. Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...

  8. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

  9. Java socket通信

    首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程  等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...

随机推荐

  1. Vue.js 源码分析(六) 基础篇 计算属性 computed 属性详解

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护,比如: <div id="example">{{ messag ...

  2. ucoreOS_lab8 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  3. 重启电脑 wamp图标是橙色(未变绿)

    记录一个错误: 修复系统漏洞后,重启电脑,wamp没有开机自启动,手动启动后发现,图标是大红色变成了橙色,也就是服务未完全启动(1/2)状态. ??? 但是我其实也不知道是哪个服务(Apache/My ...

  4. Python散列类型和运算符

    集合定义 集合的交 并 差 常见的运算符的用法 字典的定义 字典的 get  items  keys  pop  popitem  update  方法 三种逻辑运算 集合 集合特性 唯一性:不存在两 ...

  5. cluster集群基本概念

    cluster集群种类: 1,LB(Load Balance)负载均衡集群: 弱点:当横向扩展到一定机器后,发现在怎么横向加机器也没有效果的时候,瓶颈就卡在分发的服务器上了,也就是LB机器上了,如何解 ...

  6. docker网络之(三)

    docker4种网络 基于docker run创建容器时,可以使用--net选项指定容器的网络模式:Docker默认有以下4种网络模式: host模式,使用--net=host指定 container ...

  7. [C13] 应用实例:图片文字识别(Application Example: Photo OCR)

    应用实例:图片文字识别(Application Example: Photo OCR) 问题描述和流程图(Problem Description and Pipeline) 图像文字识别应用所作的事是 ...

  8. Conda和Python的国内安装源

    Conda和Python的国内安装源 Windows系统: 更换python国内源的方法. 在"C:\Users[xxxx]\pip\pip.ini"文件中配置如下内容(没有则新建 ...

  9. 洛谷 P5594 【XR-4】模拟赛

    洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...

  10. JDOJ3004 超级楼梯

    JDOJ3004 超级楼梯 https://neooj.com/oldoj/problem.php?id=3004 题目描述 有一个超级楼梯共N级,刚开始时你在第一级,若每次只能跨上一级或两级,要走上 ...