JAVA - Socket

从开学到现在 也学了三个月时间的java了,一直在 在 语法和基本使用上周旋,井底之娃一枚。 这两天 有学长指点,花了两天的时间 学习了java多线程和socket的简单使用,利用周末时间 自己写了个 Socket 多客户端的 Demo,有很多不成熟或者不好的 地方,请指正。

TCP 的 Java 支持

协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议、TCP 协议和 UDP 协议。现在 TCP/IP 协议族中的主要 socket 类型为流套接字(使用 TCP 协议)和数据报套接字(使用 UDP 协议)。

Socket套接字 是面向连接的通信,基于TCP/IP协议提供了稳定的支持(Ps: TCP/IP 传输效率低于 UDP),TCP/IP 提供了Socket和Serversocket两个类, 使用 Serversocket 实例来监听端口是否 有客户端请求,并通过 accept()方法 来返回一个Socket 实例,客户端的socket和服务端的socket 就这样建立了连接,每个socket 有自己的io流 ,那么服务端的输入流对应客户端的输出流,客户端的输出流对应服务端的输入流,在这里输入流 我们采用(BufferedReader)包装流,输入采用(PrintStream)包装流,通过包装流 包装 输入输初流,可以方便程序数据的使用。

典型的 TCP 服务端执行如下两步操作:

创建一个 ServerSocket 实例并指定本地端口,用来监听客户端在该端口发送的 TCP 连接请求;

  1. 重复执行:

    • 调用 ServerSocket 的 accept()方法以获取客户端连接,并通过其返回值创建一个 Socket 实例;

    • 为返回的 Socket 实例开启新的线程,并使用返回的 Socket 实例的 I/O 流与客户端通信; 通信完成后,使用 Socket 类的 close()方法关闭该客户端的

套接字连接。

好了话不多说,下面贴程序。

***服务端代码***

 package socket多客户端;

 import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
public class Server { private static ArrayList<Thread_Client> list = new ArrayList<>(); private static final int PORT = 6789;
private static ServerSocket serverSocket;
private static Socket socket; static void send(String string){ // 使用 for 循环 , 遍历Arraylist 广播某客户端传来的消息
for(Thread_Client thread_Client : list){
// 调用 子线程的 send 方法
thread_Client.send(string);
} } public static void main(String[] args) { System.out.println("服务端开始运行..."); try { serverSocket = new ServerSocket(PORT); while(true){
socket = serverSocket.accept();
Thread_Client thread_Client = new Thread_Client(socket);
thread_Client.start();
System.out.println("已连接!");
list.add(thread_Client); } } catch (Exception e) {
// TODO: handle exception
System.out.println("服务端异常1");
}finally { try {
socket.close();
serverSocket.close(); } catch (IOException e2) {
// TODO: handle exception
System.out.println("服务端异常2");
} } } }

*** 然后是 处理连接后socket 的子线程***

 package socket多客户端;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.lang.*;
import java.net.Socket; public class Thread_Client extends Thread{ private BufferedReader bufferedReader = null;
private PrintStream printStream = null; Socket socket; public Thread_Client(Socket socket) {
//
this.socket = socket;
} @Override
public void run() {
// TODO Auto-generated method stub
super.run(); try {
Get_Set(socket); } catch (Exception e) {
// TODO: handle exception
System.out.println("异常1");
} } public void send(String string){
if(string != null){
printStream.println(string);
printStream.flush();
}
} public void Get_Set(Socket socket){ try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
printStream = new PrintStream(socket.getOutputStream()); Boolean flag = true;
while(flag){
String string = bufferedReader.readLine();
if("".equals(string) || string == null){
flag = false;
}else{
if("end".equals(string)){
flag = false;
}else{
System.out.println("read : " + string);
//调用 主线程 广播
Server.send(string);
}
}
} } catch (IOException e) {
// TODO: handle exception
System.out.println("异常2");
}
} }

*** 最后是 客户端代码 ***

 package socket多客户端;

 import java.io.*;
import java.net.*;
import java.util.Scanner; public class Client { private static Socket socket;
private static BufferedReader bufferedReader;
private static PrintStream printStream; // 将 读服务端数据封装在 Client—read 方法里
public static void Client_read(Socket socket){
// 匿名内部类 开 一个子线程
new Thread(new Runnable() {
private BufferedReader bufferedReader_ec; @Override
public void run() {
// TODO Auto-generated method stub try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = bufferedReader.readLine();
if("".equals(str) || str == null || "end".equals(str)){ }else{
System.out.println(str);
} } catch (Exception e) {
// TODO: handle exception
}
}
}).start();
} // Get_Set 方法 处理 客户端与服务端 数据的读写
static void Get_Set(Socket socket){ try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
printStream = new PrintStream(socket.getOutputStream());
Scanner keyboard = new Scanner(System.in); Boolean flag = true;
while(flag){ // 在这里调用 之前封装的 Client_read 方法
Client_read(socket); // 从 键盘 输入数据
String shuru = keyboard.nextLine();
if("".equals(shuru) || shuru == null){
flag = false; // 通过 嵌套if else 筛掉无用值
}else{
if("end".equals(shuru)){
flag = false;
}else{
printStream.println(shuru); // 发送至服务端
printStream.flush();
}
} } } catch (Exception e) {
// TODO: handle exception
} } public static void main(String[] args) { try { socket = new Socket("localhost",6789);
System.out.println("客户端已连接至服务端!");
Get_Set(socket); } catch (Exception e) {
// TODO: handle exception
System.out.println("客户端异常1");
}finally {
try {
printStream.close();
bufferedReader.close();
socket.close(); } catch (Exception e2) {
// TODO: handle exception
System.out.println("客户端异常2");
}
} } }

好了 ,下面我们来运行 看看结结果。

第一个控制台是 服务端

第二个控制台是 客户端1

第三个控制台是 客户端2

这样我们就实现了 一个简单的基于TCP/IP协议的socket多客户端通信。

笔者 还是个 编程菜鸟,有什么不好的地方,希望各位大牛可以指正。

JAVA-Socket通信笔记的更多相关文章

  1. java socket通信-传输文件图片--传输图片

    ClientTcpSend.java   client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...

  2. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  3. Java Socket通信读取相关信息代码

    转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...

  4. Java Socket 学习笔记

    TCP协议的Socket编程 Socket:英文中的意思是插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket.Java中所有关于网络编程的类都 ...

  5. Java socket通信

    首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程  等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...

  6. Java Socket通信以及可能出现的问题解决

    Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...

  7. Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...

  8. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA)   好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...

  9. Java Socket通信实例

    一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...

  10. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

随机推荐

  1. Java位向量的实现原理与巧妙应用

    Java位向量的巧实现原理与巧妙应用 1.博文介绍 本篇博文将会介绍几本的位运算含义.位向量介绍.BitSet实现原理.Java位向量的应用.拓展介绍Bloom Filter等. 2.位运算介绍 1) ...

  2. 使用idea2017搭建SSM框架

    搭建个SSM框架居然花费了我好长时间!特此记录! 需要准备的环境: idea 2017.1 jdk1.8 Maven 3.3.9  请提前将idea与Maven.jdk配置好,本次项目用的都是比较新的 ...

  3. Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务

    上篇博文中我们介绍了Azure Messaging-ServiceBus Messaging消息回执机制. Azure Messaging-ServiceBus Messaging消息回执机制 本文中 ...

  4. 20155304 2016-2017-2 《Java程序设计》第六周学习总结

    20155304 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 串流设计的概念 无论来源和目的地实体形式是什么,只要取得InputStream和Ou ...

  5. 老李分享:持续集成学好jenkins之解答疑问

    老李分享:持续集成学好jenkins之解答疑问   poptest(www.poptest.cn)在培训的过程中使用jenkins搭建持续集成环境,让学员真正交流持续集成到底是什么,怎么去做的. Je ...

  6. 自动化测试培训:qtp脚本获取获取汇率数据

    poptest(www.poptest.cn)致力于测试开发工程师的培训,以培养能胜任做测试工具开发,完成自动化测试,性能测试,安全性测试等工作能力为目标.自8月份成立2个月内中针对企业在职人员的能力 ...

  7. 不忘初心 --- 重读<<The C Programming Language>>

    这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...

  8. node.js框架express的安装

    node.js框架express的安装 首先假定你已经安装了 Node.js,接下来为你的应用创建一个目录,然后进入此目录并将其作为当前工作目录. $ mkdir myapp $ cd myapp 通 ...

  9. 结合ThreadLocal来看spring事务源码,感受下清泉般的洗涤!

    在我的博客spring事务源码解析中,提到了一个很关键的点:将connection绑定到当前线程来保证这个线程中的数据库操作用的是同一个connection.但是没有细致的讲到如何绑定,以及为什么这么 ...

  10. ServerSuperIO 3.5版本的体系结构,以及未来规划的几点思考

    一.特点 1.轻型高性能通信框架,适用于多种应用场,轮询模式.自控模式.并发模式和单例模式. 2.不仅是通讯框架,是设备驱动.IO通道.控制模式场景的协调机制. 3.支持协议驱动器,可以按规范写标准协 ...