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

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

对于服务器端:建立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. 高强度学习训练第八天总结:MySQL的一些优化

    为什么要做MYSQL优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库中的数据会越来越多,处理时间会相应变慢. 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计 ...

  2. vuejs之路由应用之二

    现在我们开始一个应用: 一个应用中包含4个组件,我们暂且可以想象是4个页面,首先是App.vue,App.vue中又包含3个子组件:About.vue,Home.vue,Document.vue Ap ...

  3. CSS 2D 转换

    通过CSS 2D转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D转换一共五个属性:transfrom=> translate(X轴数值px,Y轴数值px):元素从其当前位置移动,根据 ...

  4. Junit4模板

    模板 MallApplicationTests import org.junit.runner.RunWith; import org.springframework.boot.test.contex ...

  5. IOS中的深拷贝和浅拷贝

    标签: 什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是 ...

  6. Android Monkey使用

    Monkey 是什么? Android SDK自带的压力测试工具,也是一个命令行工具.它向系统发送伪随机的用户事件流(如按键输入,触摸屏输入,手势输入等),实现对正在开发的应用程序进行压力测试. (1 ...

  7. 算法基础:BFS和DFS的直观解释

    算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...

  8. [日常] 跨语言的POST请求问题的解决

    部门对外提供了一个HTTP的POST接口,但是对方公司的程序员使用C语言进行的调用,PHP这边一直无法获取到参数.遇到这种情况是因为对方没有完全按照HTTP协议中的POST发送数据.在HTTP头部分没 ...

  9. STL关联容器的基本操作

    关联容器 map,set map map是一种关联式容器包含 键/值 key/value 相当于python中的字典不允许有重复的keymap 无重复,有序 Map是STL的一个关联容器,它提供一对一 ...

  10. JSON理解(一篇就够了)

    可以看看视频讲解,视频几十分钟就结束了 JSON 1.什么是json 其实是一种数据格式的规范,与开发的语言无关,轻量级的数据格式 全称JavaScript Object Notation 2.优点: ...