概述
网络协议
每一层都有对应的协议
TCP/IP协议
TCP三次握手
作用:验证是否能发送/接收数据
第一次握手:客户端发送能力
第二次握手:服务器的接收和发送能力(返回信息给客户端,让客户端知道服务器可以接收)
第三次握手:客户端的接收能力
三次之后就可以发送数据了
网络通信的实现
socket编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。
java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。
当然,这里的ServerSocket只是socket通信中的一种,实际上,socket通信有三种模式来让我们实现:
1.流式套接字
提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收,其实他对应使用的是TCP协议
2.数据报式套接字
面向无连接,数据报以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序无序,其实他对应使用的是UDP协议
3.原始式套接字
该接口允许对较低层次协议,如IP直接访问。可以接收本机网卡上的数据帧或数据包,对监听网络流量和分析很有用
TCP协议通信
TCP是一个面向连接的,可靠的,基于字节流的传输层协议.
面向连接: 所谓的连接,指的是客户端与服务器端的连接,在双方相互通信之前,TCP需要三次握手建立连接.
可靠性:TCP花费了非常多的功夫保证连接的可靠性,这个可靠性体现在下面两个方面:
服务端编程
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
*/
public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept(); //如果没链接就阻塞
System.out.println("连接了");
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
BufferedReader reader = null;
BufferedWriter writer =null;
reader=new BufferedReader(new InputStreamReader(inputStream)); //把字节流转换为字符流再转换为Buffer
writer= new BufferedWriter(new OutputStreamWriter(outputStream));
//接收
String line = reader.readLine();
System.out.println("接收到客户端的信息: "+line);
//发送
writer.write("我是服务端发的信息");
writer.newLine();//换行符 因为是字符缓冲流,它读是一行一行读的
writer.flush(); //如果不刷新或者关闭,那么数据就会在缓冲区读不出来
writer.close();
reader.close();
socket.close();
serverSocket.close();
}
}
客户端实现
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class Client3 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
new Send(socket).start();
new Receive("客服",socket).start();
}
}
方法实现
import java.io.*;
import java.net.Socket;
public class Receive extends Thread{
private Socket socket;
private boolean flag=true;
public Receive(String name, Socket socket) {
super(name);
this.socket = socket;
}
@Override
public void run() {
while (flag){
String receive = receive();
System.out.println(receive);
}
}
public String receive() {
InputStream inputStream = null;
BufferedReader reader = null;
String line = null;
try {
inputStream = socket.getInputStream();
reader=new BufferedReader(new InputStreamReader(inputStream)); //把字节流转换为字符流再转换为Buffer
//接收
line = reader.readLine();
return this.getName()+":"+line;
} catch (IOException e) {
flag=false;
CloseUtil.close(reader,socket);
e.printStackTrace();
}
return null;
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Send extends Thread{
private Socket socket;
private boolean flag=true;
Scanner input = new Scanner(System.in);
public Send(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (flag){
send(input.next());
}
}
public void send(String str){
OutputStream outputStream = null;
BufferedWriter writer =null;
try {
outputStream = socket.getOutputStream();
writer= new BufferedWriter(new OutputStreamWriter(outputStream));
writer.write(str);
writer.newLine();
writer.flush();
} catch (IOException e) {
flag=false;
CloseUtil.close(writer,socket);
e.printStackTrace();
}
}
}
import java.io.Closeable;
import java.io.IOException;
public class CloseUtil {
public static void close(Closeable... closeables){
if (closeables != null && closeables.length>0){
for (Closeable closeable : closeables) {
if (closeable!=null){
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
最后
以上就是潇洒秀发为你收集整理的java网络协议的全部内容,希望文章能够帮你解决java网络协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复