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

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

对于服务器端:建立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. Javase之集合体系(3)之Set及其子类知识

    集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> ​ 特点:无序(存储顺序与取出顺序不一致 ...

  2. Swift 字典模型互转总结

    现在很多iOS项目的开发开始转向Swift语言. 相信 Swift语言很快会成为iOS工程师 必备技能. 字典转模型, 模型转转字典在开发过程中扮演非常重要的角色. 今天就和大家分享一下使用Swift ...

  3. 1_Swift概况

    Swift 标准库 解决复杂的问题并编写高性能,可读的代码 概况 Swift标准库定义了用于编写Swift程序的基本功能,其中包括 1.如基本数据类型Int,Double以及String 2.共同的数 ...

  4. Linux—主机扫描工具(Nmap)

    Nmap包含五项基本功能: 主机探测 (Host Discovery) 端口扫描 (Port Scanning) 版本检测 (Version Detection) 操作系统侦测 (Operating ...

  5. CodeForces - 1260C(贪心+思维)

    题意 https://vjudge.net/problem/CodeForces-1260C 有一串砖,凡是r的倍数而不是b的倍数必须涂红,凡是b的倍数而不是r的倍数必须涂蓝,是公倍数则选一个涂.把涂 ...

  6. Vue项目开发前的准备工作,node的安装,vue-cli的安装

    一.安装node 1-  点击这里进入node官网下载 2- 3- 下载完成是这样的 4-  双击打开进行安装,一路next,安装完成是这样 5-  打开cmd进入安装node的文件夹,输入node ...

  7. 10. Go语言—for循环

    一.for循环 for 初始化语句;条件判断;变量修改 for i := 0; i < 100; i++{ fmt.Printf('i=%d\n',i) } // C 的 while 一样 fo ...

  8. luoguP2178 [NOI2015]品酒大会(后缀数组做法)

    题意 因为一个\(k\)相似必定为\(k-1,k-2....0\)相似,对于一个\(lcp\)为\(k\)后缀对\((i,j)\),我们只用把它的贡献加在\(k\)的答案上,最后求一个后缀和和后缀ma ...

  9. [LOJ 6288]猫咪[CF 700E]Cool Slogans

    [LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...

  10. Ubuntu安装有道词典

    dpkg -i youdao-dict.deb正常安装 会报一堆依赖关系的错误, 1.更新系统 #更新系统 apt-get update apt-get dist-upgrade 2.对每一个未安装的 ...