java socket通信:聊天器(1)
目的:实现多个客户之间的通信
首先,这个聊天器的框架是这样的:
对于服务器端:建立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)的更多相关文章
- windows phone 8.1开发:socket通信聊天
本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- java socket通信-传输文件图片--传输图片
ClientTcpSend.java client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...
- java Socket通信使用BufferedReader和BufferedWriter的注意事项
注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...
- Java Socket通信读取相关信息代码
转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...
- Java Socket通信以及可能出现的问题解决
Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...
- Java Socket通信实现私聊、群聊
前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...
- 【Java】Java Socket 通信演示样例
用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...
- Java socket通信
首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程 等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...
随机推荐
- kali linux maltego-情报收集工具
Maltego是一个交互式数据挖掘工具,它为链接分析呈现有向图.该工具用于在线调查,以发现互联网上各种来源的信息片段之间的关系. 注册Maltego账号,注册地址:https://www.paterv ...
- 实验吧简单的SQL注入1,简单的SQL注入
接上面一篇博客. 实验吧简单的sql注入1 题目连接 http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误, ...
- vue全局路由守卫beforeEach+token验证+node
在后端安装jsonwebtoken npm i jsonwebtoken --save 在 login.js文件中引入 // 引入jwtconst jwt = require ...
- Pwn-level2
题目地址 https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1 先看一下文件的属性 32位 ...
- mysql high severity error 缺少根元素
high severity error 缺少根元素: C:\Users\cf.yu\AppData\Roaming\Oracle\MySQL Notifier里的settings.config.删除他 ...
- 消息中间件(二)MQ使用场景
一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,Rabbit ...
- 【AtCoder】AtCoder Grand Contest 035 解题报告
点此进入比赛 \(A\):XOR Circle(点此看题面) 大致题意: 给你\(n\)个数,问是否能将它们摆成一个环,使得环上每个位置都是其相邻两个位置上值的异或值. 先不考虑\(0\),我们假设环 ...
- vue组件通信传值——Vuex
一.Vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex 也集成到 Vu ...
- Unity编辑器扩展学习 转载
https://www.xuanyusong.com/archives/category/unity/unity3deditor 1 using UnityEngine; public class T ...
- k8s 二进制部署详解
环境说明: 192.168.1.101 -- master01 + etcd01 192.168.1.102 -- etcd02 192.168.1.103 -- etcd03 192.168.1.1 ...