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建立连接,之后它们就可以进行通信了.首 ...
随机推荐
- SAP MM ME29N 试图取消审批报错 - Document has already been outputed(function not possible) -
SAP MM ME29N 试图取消审批报错 - Document has already been outputed(function not possible) - 今天收到用户的一个问题,说他试图 ...
- 【English】三、以o结尾单词变复数
一.以O结尾的词,许多加es构成复数,特别是一些常用词如: potatoes 土豆 tomatoes 西红柿 echoes 回声 tornadoes 龙卷风 torpedoes ...
- ASP.NET Zero--基于令牌的认证&SWAGGER UI
基于令牌的认证 任何应用程序都可以将应用程序中的任何功能认证和使用为API.例如,您可以创建一个移动应用程序消耗相同的API.在本节中,我们将演示来自Postman的API (Google Chrom ...
- 周一02.4变量&垃圾回收机制
一.变量 1. 什么是变量 量:记录事物的某种状态,即事物典型的特征 变:事物的状态是可以发生变化的 2. 为何要用变量 是为了让计算机能够像人一样记录事物的状态 3. 如何用变量 (先定义后引用) ...
- EJS 语法
教程
- 初窥css---盒子以及盒子扩展
盒子以及盒子扩展 盒子 盒子是用来实现将网页区域化的一个非常重要的工具,盒子使得网页各部分十分清晰的被分开,对于程序员十分友好(...),并且使得网页更加容易维护. 盒子的常用属性 宽和高这两个属性就 ...
- MySQL存储引擎InnoDB与MyISAM的区别
一.比较 事务:InnoDB是事务型的,可以使用Commit和Rollback语句. 并发:MyISAM只支持表级锁,InnoDB还支持行级锁. 外键:InnoDB支持外键. 备份:InnoDB支持在 ...
- 【html】使用img标签和背景图片之间的区别
1.加载问题 背景图片会等到html结构加载完成才开始加载 img标签是网页结构的一部分,会在html结构加载的时候加载 在网页加载的过程中,背景图片会等到结构加载完成(网页的内容全部显示以后)才开始 ...
- 对多条件进行组合,生成笛卡尔积的用例集合的python代码实现
做专项测试需要对一些因素进行组合的测试,这里组合起来后数据量可能很大,我们可以用python来代劳 代码有优化空间,目前先用着. ************************代码开始******* ...
- LOJ #6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相
我可以大喊一声这就是个思博题吗? 首先如果你能快速把握题目的意思后,就会发现题目就是让你求出每个点要成为树的重心至少要嫁接多少边 先说一个显然的结论,重心的答案为\(0\)(废话) 然后我们考虑贪心处 ...