Java Socket、计算机网络
一个服务器对应一个客户端
http://blog.51cto.com/wangdy/1588379
https://www.cnblogs.com/rocomp/p/4790340.html
package cn.day2; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class MyClient {
public static void client() throws Exception {
Socket socket = new Socket("127.0.0.1", 10000);
System.out.println("客户端启动.....");
OutputStream out = socket.getOutputStream();
DataOutputStream doutput = new DataOutputStream(out);
doutput.writeUTF("客户端发送信息");
doutput.flush();
InputStream input = socket.getInputStream();
DataInputStream dinput = new DataInputStream(input);
String str = dinput.readUTF();
System.out.print("客户端收到消息:" + str); } public static synchronized void client1() throws Exception {//错 Socket socket[] = new Socket[5];
for(int i=0;i<5;i++){
socket[i] = new Socket("127.0.0.1", 10000);
System.out.println("客户端启动.....");
OutputStream out = socket[i].getOutputStream();
DataOutputStream doutput = new DataOutputStream(out);
doutput.writeUTF("客户端发送信息"+i);
doutput.flush(); InputStream input = socket[i].getInputStream();
DataInputStream dinput = new DataInputStream(input);
String str = dinput.readUTF();
System.out.print("客户端收到消息:" + str);
}
} public static void main(String[] args) throws Exception {
// client();
client1();
}
}
package cn.day2; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class MyServer {
public static void server()throws Exception{
ServerSocket server = new ServerSocket(10000);
System.out.println("启动服务器.....");
Socket socket = server.accept();
InputStream binput = socket.getInputStream();
DataInputStream dinput = new DataInputStream(binput);
String str = dinput.readUTF();
System.out.print("服务器收到信息:" + str);
Thread.sleep(10000);
OutputStream output = socket.getOutputStream();
DataOutputStream dout = new DataOutputStream(output);
dout.writeUTF("服务器发送信息");
dout.flush();
} public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
server();
}
}
一个服务端多个客户端
package cn.day2; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; public class MyMulSocketServer extends ServerSocket {
public static void main(String[] args) throws IOException {
MyMulSocketServer server = new MyMulSocketServer();
}
public static final int PORT = 11112; public MyMulSocketServer() throws IOException{
super(PORT);
System.out.println("初始化服务器...");
while(true){
Socket socket = null;
try {
socket = accept();
System.out.println("连接...");
new MyThread(socket).start();;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
// try {
// if(null != socket){
// socket.close();
// }
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
} class MyThread extends Thread{
MyThread(){ }
Socket socket = null; public MyThread(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try{
System.out.println("开始运行...");
BufferedReader br = null;
PrintWriter pw = null;
br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream(), true);
String line = br.readLine();
System.out.println("Hello " + line);
pw.println("Hello " + line);
// pw.flush(); pw.close();
br.close();
}catch( Exception e){ }finally{
// try {
// if(null != socket){
// socket.close();
// }
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
} }
package cn.day2; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class MyMulClient { public static void main(String[] args) throws IOException, IOException {
// for(int i=0;i<10;i++){
System.out.println("客户端开始...");
client();
// }
} public static void client(){
try {
Socket [] clients = new Socket[10];
for(int i=0;i<10;i++){
Socket client = new Socket("127.0.0.1", 11112);
clients[i] = client;
}
for(int i=0;i<10;i++){
Socket client = clients[i];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(client.getOutputStream(), true);
String line = br.readLine();
System.out.print(line);
// pw.write(line);
pw.println(line);
pw.flush(); br.close();
pw.close();
client.close();
} } catch (UnknownHostException e) {
e.printStackTrace();
} catch ( Exception e) {
e.printStackTrace();
}
}
}

计算机网络是通过传输介质、通信设施和网络通信协议,
网络传输介质是网络中发送方与接收方之间的物理通路,它对网络的数据通信具有一定的影响。常用的传输介质有双绞线、同轴电缆、光纤、无线传输媒介
OSI七层网络模型(开放系统互连参考模型)
OSI七层网络模型从上到下:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
其中应用层、表示层、会话层、传输层被称作主机层,是开发工程师通过开发应用程序处理和实现的内容
网络层、数据链路层、物理层
第一层:物理层
为设备之间的信息传输提供可靠环境,那么这个环境是什么呢?
就是如:同轴电缆、插头、接收器、水晶头、网线等。可以在通信的两个数据终端的设备之间连接起来形成一条通路。
第二层:数据链路层
提供数据的传送服务。这里涉及一个信息就是帧,它是数据传输的单元,不同的协议帧的长短也不同。它还有差错恢复,流量控制的功能,常见的有网卡,网桥
第三层:网络层
它的作用是路由的选择,网络的激活和终止。它还有的一个重要功能就是在一条数据链路上复用多条网络连接,大多采用的是分时复用的技术
我们常见的是路由器、网关等
第四层:传输层
它是两台计算机经过网络进行数据通信时最基础的端到端的一个层次。它的服务满足了传送质量、传达速度、传送费用的不同需要。它还具有差错恢复,流量控制的功能
二、三次握手与四次挥手
TCP是面向连接的协议,因此每个TCP连接都有三个阶段:建立连接、数据传送和连接释放。
连接建立经过三个步骤,通常称为“三次握手”

第一次握手:客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:服务器收到连接请求报文,如果同意建立连接,向客户机发送确认报文段,并为该TCP连接分配缓存和变量
第三次握手:客户机收到服务器的确认报文段后,向服务器给出确认报文段,并且也要给该连接分配缓存和变量,此包发送完毕,
- 客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。(ACK=1,seq=x+1,ack=y+1)。
TCP四次挥手过程如下:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
- TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
- 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
- 服务器关闭客户端的连接,发送一个FIN给客户端。
- 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
Java Socket、计算机网络的更多相关文章
- 【Java】Java Socket编程(1)基本的术语和概念
计算机程序能够相互联网,相互通讯,这使一切都成为可能,这也是当今互联网存在的基础.那么程序是如何通过网络相互通信的呢?这就是我记录这系列的笔记的原因.Java语言从一开始就是为了互联网而设计的,它为实 ...
- Java Socket与操作系统的关系
Socket与操作系统有什么关系呢?请细读下文 简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 ...
- Java Socket:飞鸽传书的网络套接字
在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快.会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”.而在 Java 中,网络套接字(Socket)扮演了同 ...
- JAVA通信系列一:Java Socket技术总结
本文是学习java Socket整理的资料,供参考. 1 Socket通信原理 1.1 ISO七层模型 1.2 TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...
- JAVA Socket 编程学习笔记(二)
在上一篇中,使用了 java Socket+Tcp/IP 协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...
- JAVA Socket 编程学习笔记(一)
1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...
- Java Socket Server的演进 (一)
最近在看一些网络服务器的设计, 本文就从起源的角度介绍一下现代网络服务器处理并发连接的思路, 例子就用java提供的API. 1.单线程同步阻塞式服务器及操作系统API 此种是最简单的socket服务 ...
- JAVA Socket超时浅析
JAVA Socket超时浅析 套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字&q ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- Java Socket编程(转)
Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...
随机推荐
- 程序员50题(JS版本)(七)
程序31:有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中 var test=[213,134,134,84,62,11]; const num=33; test.push(num ...
- 你真的懂JavaScript基础类型吗
夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...
- Retrofit2.0 设置 连接超时
Retrofit2.0 这个网络请求框架使用了很久了,最近一次出现一个小插曲. 有一个接口,返回的数据量因为业务的原因 会返回很大的数据量,此时网络不大好的情况下,会出现请求失败的情况 也就是回调了 ...
- iBatis第二章:搭建一个简单的iBatis开发环境
使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...
- .net core下Redis帮助类
0.引入.net core环境下Redis的NuGet包,StackExchange.Redis,现目前最新的2.0.519. 帮助类Code: using System; using Syste ...
- 想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜
本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事.有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况.于是周榜(按周重置更新的榜单)诞生了 ...
- JavaScript(四)变量
变量的声明 在JavaScript程序中,使用一个变量之前应当使用关键字var进行声明,如下所示:var num;var sum; 也可以写成var num,sum,avg;如果只是声明变量而没有给变 ...
- RocketMQ从3.5.8升级到4.3.2版本实战记录
背景 我们在很早之前大约在2015年8月份左右我们开始使用Rocketmq作为公司消息中间件,那个时候RocketMQ还没有捐赠给Acaphe. RocketMQ版本还是3.2.6,中间升级了一次版本 ...
- 伺服电机&旋转变压器&光电编码器
旋转变压器与光电编码器是目前伺服领域应用最广的测量传感器. 一.伺服系统 又称为随动系统,精确的跟随或者复现某个过程的反馈系统. 使物体的位置.方位.状态等输出被控量能够跟随目标(设定)的任意变化的自 ...
- git tag 打标签
注意:在哪个分支上打tag一定要先提交该分支到远程gitlab仓库 标签(tag)操作 1. 查看所有标签 git tag 默认标签是打在最新提交的commit上的 2.本地打新标签 git tag ...