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

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

对于服务器端:建立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. FCC---Animate Elements at Variable Rates----一闪一闪亮晶晶,不同的闪动节奏

    There are a variety of ways to alter the animation rates of similarly animated elements. So far, thi ...

  2. 如何给HTML页面的文本设置字符和单词间距

    设置字符和单词间距介绍 属性名 单位 描述 letter-spacing px 设置字符间距 word-spacing px 设置单词间距 letter-spacing设置字符间距 letter-sp ...

  3. MVC 身份证图像识别(调用dll)

    源码下载 -> 提取码 QQ505645074 Index.cshtml <!DOCTYPE html> <html> <head> <meta cha ...

  4. PHP多进程系列笔(转)

    本系列文章将向大家讲解pcntl_*系列函数,从而更深入的理解进程相关知识. PCNTL在PHP中进程控制支持默认是关闭的.您需要使用 --enable-pcntl 配置选项重新编译PHP的 CGI或 ...

  5. oracle 死锁 锁

    [zhuan]今天看群里在讨论数据库死锁的问题,也一起研究了下,查了些资料在这里总结下. 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...

  6. 数据库 OR 运维 ____bayaim

    最近一直在思考,想想未来的道路和自己努力的方向.马云曾说过现在的年轻人缺少“慢下来”,只有人慢下来才能更好思考,想好方法和目标才更靠近才成功.如果,一直不停的努力,在错误的道路越走越远,势必会浪费时间 ...

  7. sleep() 和 wait() 有什么区别:

      ①原理不同. ​ sleep()方法是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行一段时间,而把执行机会让给其他线程,等到计时时间一到,此线程会自动苏醒.而wait() ...

  8. liteos CPU占用率(十六)

    1. 概述 1.1 基本概念 CPU(中央处理器, Central Processing Unit)占用率可以分为系统CPU占用率和任务CPU占用率两种. 系统CPU占用率(CPU Percent)是 ...

  9. [日常] gocron源码阅读-使用go mod管理依赖源码启动gocron

    从 Go1.11 开始,golang 官方支持了新的依赖管理工具go modgo mod download: 下载依赖的 module 到本地 cachego mod edit: 编辑 go.modg ...

  10. fiddler---Fiddler工具详细介绍

    在做测试的过程中,遇到一些问题都会去进行抓包,抓包可以帮助我们解决很多问题,抓包工具有很多比如fiddler,浏览器调试工具(F12),charles等,抓包工具是我们测试人员必不可少的一项技能. 什 ...