1.简单聊天室-客户端给服务器发数据(示例)

客户端:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;public class Client {public static void main(String[] args) throws UnknownHostException, IOException {//定义套接字Socket socket = new Socket("192.168.13.2", 8091);//使用socket来读写数据OutputStream outputStream = socket.getOutputStream();//用起来也不方便,打印流PrintStream ps = new PrintStream(outputStream);ps.println("你好。。。");//关闭资源ps.flush();ps.close();socket.close();}
}

服务器:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** 定义服务器,做为数据的中转中心* 1.实现客户端给服务器发送数据* @author igeekhome**/
public class Server {public static void main(String[] args) throws IOException {//获取服务器套接字ServerSocket serverSocket = new ServerSocket(8091);-//等待客户端连接,会阻塞线程,直到客户端连接,如果客户端连接就会产生并注册一个套接字Socket socket = serverSocket.accept();//使用套接字来获取和输出数据,通过流的方式来实现InputStream inputStream = socket.getInputStream();//为了方便字节流,使用Scanner来扫描数据Scanner scanner = new Scanner(inputStream);//循环获取数据while(scanner.hasNextLine()) {String data = scanner.nextLine();System.out.println(data);}//关闭资源scanner.close();socket.close();serverSocket.close();}
}

2.简单聊天室-实现发送和同时接收【示例】

使用多线程来完成此示例

发送数据线程:

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class ClientSendThread implements Runnable {private Socket socket;private PrintStream ps;public ClientSendThread(Socket socket) throws IOException {this.socket = socket;ps = new PrintStream(socket.getOutputStream());}@Overridepublic void run() {Scanner sc = new Scanner(System.in);while(true) {System.out.println("请输入发送的数据:");String data = sc.nextLine();ps.println(data);}}}

接收数据线程:

import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;/*** 接收数据的线程,我们肯定需要输入流,从Socket中获取,做为参数传进来* 打开输入流* @author igeekhome**/
public class ClientReceiveThread implements Runnable {private Socket socket;private Scanner scanner;public ClientReceiveThread(Socket socket) throws IOException {this.socket = socket;scanner = new Scanner(socket.getInputStream());}@Overridepublic void run() {while(true) {while(scanner.hasNextLine()) {String data = scanner.nextLine();System.out.println("服务器发来的数据:"+data);}}}}

客户端启动线程:

/*** 如果客户端既要能够获取用户输入的数据然后发送给服务器,这是我们需要使用Scanner扫描用户输入,但是这个扫描会阻塞线程* 那么我们还想从套结子中获取服务器写会的数据,就无法实现,因为该操作也要阻塞线程,想要解决这样的问题就需要使用两个独立的线程* 为了结构清晰,我们尾客户端定义两个子线程,一个线程用来发送数据,一个线程永来接受数据* @author igeekhome**/
public class Client {public static void main(String[] args) throws UnknownHostException, IOException {//定义套接字Socket socket = new Socket("localhost", 8091);new Thread(new ClientSendThread(socket)).start();new Thread(new ClientReceiveThread(socket)).start();}
}

服务器端做为中转中心:

/*** 定义服务器,做为数据的中转中心* 1.实现客户端给服务器发送数据* @author igeekhome**/
public class Server {public static void main(String[] args) throws IOException {//获取服务器套接字ServerSocket serverSocket = new ServerSocket(8091);//等待客户端连接,会阻塞线程,直到客户端连接,如果客户端连接就会产生并注册一个套接字Socket socket = serverSocket.accept();System.out.println("客户端连接成功");//使用套接字来获取和输出数据,通过流的方式来实现InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();//为了方便字节流,使用Scanner来扫描数据Scanner scanner = new Scanner(inputStream);PrintStream ps = new PrintStream(outputStream);//循环获取数据while(true) {while(scanner.hasNextLine()) {String data = scanner.nextLine();System.out.println("服务器接受的数据"+    data);ps.println(data);}}}
}

3.多客户端聊天器【示例】

使用多线程来完成此示例

发送数据线程:

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class ClientSendThread implements Runnable {private Socket socket;private PrintStream ps;public ClientSendThread(Socket socket) throws IOException {this.socket = socket;ps = new PrintStream(socket.getOutputStream());}@Overridepublic void run() {Scanner sc = new Scanner(System.in);while(true) {System.out.println("请输入发送的数据:");String data = sc.nextLine();ps.println(data);}}}

接收数据线程:

/*** 接受数据的线程,我们肯定需要输入流,从Socket中获取,做为参数传进来* 打开输入流* @author igeekhome**/
public class ClientReceiveThread implements Runnable {private Socket socket;private Scanner scanner;public ClientReceiveThread(Socket socket) throws IOException {this.socket = socket;scanner = new Scanner(socket.getInputStream());}@Overridepublic void run() {while(true) {while(scanner.hasNextLine()) {String data = scanner.nextLine();System.out.println("服务器发来的数据:"+data);}}}}

循环读取数据线程:

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.List;
import java.util.Scanner;public class ServerThread implements Runnable{private Socket socket;private List<Socket> socketList;private Scanner scanner;public ServerThread(Socket socket,List<Socket> socketList) throws IOException {this.socket = socket;this.socketList = socketList;this.scanner = new Scanner(socket.getInputStream());}@Overridepublic void run() {while(true) {//如果有数据就读取while(scanner.hasNextLine()) {String data = scanner.nextLine();for(Socket sk : socketList) {if(sk==socket) {continue;}try {PrintStream ps = new PrintStream(sk.getOutputStream());ps.println(data);} catch (IOException e) {e.printStackTrace();}}}}}}

客户端启动线程:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;/*** 如果客户端既要能够获取用户输入的数据然后发送给服务器,这是我们需要使用Scanner扫描用户输入,但是这个扫描会阻塞线程* 那么我们还想从套结子中获取服务器写会的数据,就无法实现,因为该操作也要阻塞线程,想要解决这样的问题就需要使用两个独立的线程* 为了结构清晰,我们尾客户端定义两个子线程,一个线程用来发送数据,一个线程永来接受数据* @author igeekhome*/
public class Client {public static void main(String[] args) throws UnknownHostException, IOException {//定义套接字Socket socket = new Socket("localhost", 8091);new Thread(new ClientSendThread(socket)).start();new Thread(new ClientReceiveThread(socket)).start();}
}

服务器端做为中转中心:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;/*** 定义服务器,做为数据的中转中心* 1.实现客户端给服务器发送数据* 2.实现获取客户端发来得数据,同时将数据发回客户端* 3.服务器支持对客户端的连接,accept方法,就可以获取一个客户端的连接,要获取多客户段的操作,就需要存储于多个客户端之间的连接,就是socket* @author igeekhome**/
public class Server {private static List<Socket> socketList = new ArrayList<Socket>();public static void main(String[] args) throws IOException {//获取服务器套接字ServerSocket serverSocket = new ServerSocket(8091);//等待客户端连接,会阻塞线程,直到客户端连接,如果客户端连接就会产生并注册一个套接字,一个客户端连接的操作需要一个独立线程来支持while(true) {Socket socket = serverSocket.accept();socketList.add(socket);System.out.println("客户端连接成功");new Thread(new ServerThread(socket, socketList)).start();}}
}

TCP方式的网络通信【聊天器示例】相关推荐

  1. Qt TCP/IP(多客户端连接服务器)多个客户端同时登陆的聊天室示例

    一.TCP和UDP的区别 这里我会用一个表格来显示这两者的区别 比较项 TCP UDP 是否连接 面向连接 无连接 传输是否可靠 可靠 不可靠 流量控制 提供 不提供 工作方式 全双工 可以是全双工 ...

  2. 网络通信篇上(udp实战开发)聊天器的开发两台电脑实现联通--socket模块的应用开发技术

    网络通信:如今业界主流由udp通信和tcp通信,udp相对来说更加复杂一些,而tcp相对来说会更加的简单一些 我们首先先理解一下udp通信原理,和创建通信的必要步骤. 我们最常用的就是通过socket ...

  3. UDP方式的网络通信【示例】

    UDP方式的网络通信 客户端: import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagram ...

  4. android 网络通信方式,Android中基于TCP协议的网络通信

    一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...

  5. 基于TCP的网络实时聊天室(socket通信案例)

    开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...

  6. TCP通信转HTTP桥接器(转发zabbix数据为例)

    需求场景 由于项目需要我们有大量服务器部署在互联网上,需要zabbix_agent监控服务器数据,但是用于接收监控数据的zabbix_server对访问安全要求较为严格.zabbix_server部署 ...

  7. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  8. java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...

  9. 如何用Python实现多任务版的udp聊天器

    这篇文章主要为大家详细介绍了Python实现多任务版的udp聊天器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.案例示例 二.案例说明 1.编写一个有2个线程的程 ...

最新文章

  1. Delphi和C++数据类型对照表
  2. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
  3. C语言经典例68-数组元素循环偏移
  4. React Hooks-概览
  5. shell编程系列25--shell操作数据库实战之备份MySQL数据,并通过FTP将其传输到远端主机...
  6. 读懂操作系统之虚拟内存(一)
  7. python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归
  8. Eclipse Console 加大显示的行数,禁止弹出
  9. 安装centos7系统
  10. Bootstrap3 地址元素样式
  11. oracle mysql认证考试流程_报考oraclemysql认证考试流程
  12. java springboot android 安卓点餐外卖源码
  13. 深度残差网络+自适应参数化ReLU激活函数:调参记录2
  14. IP地址详解(扫盲篇)
  15. 信奥中的数学:集合与子集
  16. html5手机触屏效果,html5手机触屏touch事件的详细介绍
  17. sci论文图排版技巧分享
  18. Go实现简易聊天室(群聊)
  19. 系统dll文件损坏、缺失 如何解决
  20. 阿里月活用户增长提速,营收增速稍微放缓,或因拼多多

热门文章

  1. 给CentOS添加第三方源(RPMForge源)
  2. java反编译之 基础篇(class未加密未混淆)
  3. 11月热门下载资源TOP100强力推荐!
  4. Android 高级控件ListView用法
  5. 洛谷P4593 [TJOI2018]教科书般的亵渎(拉格朗日插值)
  6. JavaScript年月日和时间戳互转
  7. ubuntu 14.04 64bit 安装 oracle 11g r2
  8. [U3D Demo] 手机FPS射击游戏
  9. pivotx的entry和page内容里的日期格式修改
  10. bShare一个强大的网页分享插件