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

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

对于服务器端:建立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. django6-orm进阶操作

    1.创建django环境的脚本 在自定义脚本中操作orm ,但是自定义脚本中不具备django的环境 ###test.py 脚本,引入django的环境即可使用orm操作数据库import os if ...

  2. JavaScript 错误异常

    JavaScript 错误异常 错误异常语句 try 语句测试代码块中的错误 catch 语句处理错误 throw 语句允许自定义错误 finally 语句在错误异常语句后,必须执行的代码块 try ...

  3. RunLoop的知识小记

    RunLoop字面上的意思是,运行循环: 其基本作用:保持程序的持续运行: 处理App中的各种事件(比如:触摸事件.定时器事件.Selector事件) 节省CPU资源,提高程序性能:该做事时做事,该休 ...

  4. Mysql8.0主从复制搭建,shardingsphere+springboot+mybatis读写分离

    1.安装mysql8.0 首先需要在192.167.3.171上安装JDK. 下载mysql安装包,https://dev.mysql.com/downloads/,找到以下页面下载. 下载后放到li ...

  5. BayaiM__MySQL 常用函数

    BayaiM__MySQL 常用函数 原创 作者:bayaim 时间:2016-06-16 09:11:13 122 0删除编辑  MySQL 常用函数 阅读(883430) | 评论(44543) ...

  6. docker 简单介绍与安装

    主机虚拟化(vmware,visual box等) type-Ⅰ type=Ⅱ 主机虚拟化是隔离最彻底的,但是由于多隔了一个虚拟的操作系统,性能会慢一些. 容器虚拟化(docker等) 隔离没有主机虚 ...

  7. 设备树处理之——device_node转换成platform_device【转】

    转自:https://www.cnblogs.com/downey-blog/p/10486568.html 以下讨论基于linux4.14,arm平台 platform device 设备树的产生就 ...

  8. web前端学习路线(干货)

  9. (转)cube-ui后编译

    转载地址:https://www.jianshu.com/p/189755f9ce43 1. 后编译介绍 目前大部分的前端项目开发都是使用es6+的代码并且使用babel进行编译,而传统的对代码包的引 ...

  10. 目标检测中的pooling操作

    1.SPPnet池化过程 假设这个feature map的尺寸是M*N*256,将这个feature map的每一个channel以4*4,2*2和1*1来划分格子,每个格子里面做max poolin ...