一:先小试牛刀,来一个基本框架吧
1.创建一个Java工程,名称可以自己定义哦
我这里写的是通讯。
代码如下,详细简答写在代码注释中
这是第一个工程。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class 通讯 {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9000);//链接的是9000端口
System.out.println("服务器等待建立链接");
Socket socket = serverSocket.accept();
System.out.println("链接已建立,读取数据");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferedReader.readLine());
socket.close();//开启这个端口要记得关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
有了第一个工程当然要第二个工程了,才能实现通讯。
我创建的是ClientCode的工程
具体代码如下:
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class ClientCode {
public static void main(String[] args) {
try {
Socket socket = new Socket("xxxxx",9000);//端口是自己的本机ip,用的是9000端口进行连接
String strValue = "hello,haha";
PrintStream p = new PrintStream(socket.getOutputStream());
p.println(strValue);
p.println("大数据2班");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
简易的通讯程序就写好了,当然这是最简单的,只是一个框架,想必大家想知道一个更全,更高级的程序,接下来我们就根据这个代码进行改进。
二:通讯程序的进阶版
接下来我们来理解一些数据传输的原理。
//动态数据采集接口
//高级(封装的:Spring Boot,Spring MVC)
//Socket(原生、原始:字节数据)
//tcp (面向连接的传输协议) 优点:传输可靠、稳定 缺点:效率不如udp
//udp (无连接的传输协议) 优点:传输速度快 缺点:传输没有tcp可靠(丢包)
//tcp的七层协议(七部分程序):传输字符串”hello、张三“ 给张三同学
// 甲公司 (甲董事长给乙董事长发公函) 乙公司
//应用层 允许接入网络资料 甲董事长写了公函 乙董事长读取公函
//表示层 对数据进行转换、加密和压缩 公函装公文袋 拆封公文袋
//会话层 管理、终止会话 甲秘书通知乙秘书 乙秘书收到公文袋
//传输层 可靠的端到端的链接 公文袋给顺丰 顺丰投递公文袋
//网络层 从源端传到目的端 顺丰规划快递路线 顺丰规划快递路线
//数据链接路 节点到节点的传输 顺丰的中间节点传输快递 顺丰的中间节点传输快递
//物理层 传输比特 公路上跑的快递车 公路上跑的快递车
//tcp怎么建立链接 怎么断开链接
这里我用了一个送快递公文函来形象描述传输的工程,相信大家因该理解了。
接下来就进入代码环节:
我这里创建的是ServerCode
详细简答写在代码的注释中:代码如下
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerCode {
//动态数据采集接口
//高级(封装的:Spring Boot,Spring MVC)
//Socket(原生、原始:字节数据)
//tcp (面向连接的传输协议) 优点:传输可靠、稳定 缺点:效率不如udp
//udp (无连接的传输协议) 优点:传输速度快 缺点:传输没有tcp可靠(丢包)
//tcp的七层协议(七部分程序):传输字符串”hello、张三“ 给张三同学
// 甲公司 (甲董事长给乙董事长发公函) 乙公司
//应用层 允许接入网络资料 甲董事长写了公函 乙董事长读取公函
//表示层 对数据进行转换、加密和压缩 公函装公文袋 拆封公文袋
//会话层 管理、终止会话 甲秘书通知乙秘书 乙秘书收到公文袋
//传输层 可靠的端到端的链接 公文袋给顺丰 顺丰投递公文袋
//网络层 从源端传到目的端 顺丰规划快递路线 顺丰规划快递路线
//数据链接路 节点到节点的传输 顺丰的中间节点传输快递 顺丰的中间节点传输快递
//物理层 传输比特 公路上跑的快递车 公路上跑的快递车
//tcp怎么建立链接 怎么断开链接
/**
* 建立链接:tcp协议的三次握手
* 第一步:客户端发送一个SYN包,进去SYN_SEND的状态 相当于张三同学打电话的拨号
* 第二步:服务器端收到SYN,确认SYN,再发送SYN+ACK,进入SYN_RECV状态 父母收到响铃,按下接听,说一句“喂”
* 第三步:客户端收到SYN+ACK,向服务器发送ack的响应。服务器和客户端都进入链接 张三同学回答一句“喂”,开始正常通话
*/
/**
* 断开链接:tcp协议的四次挥手
*
*/
static Socket socket = null;
//发送消息的线程
//发送消息的线程
private static class SendThread extends Thread {
@Override
public void run() {
PrintStream p = null;//6
try {
p = new PrintStream(socket.getOutputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String strLine = bufferedReader.readLine();
p.println(strLine);//10
if ("byebye".equals(strLine)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();//13
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//接收消息并显示的线程
private static class RecvThread extends Thread {
@Override
public void run() {
BufferedReader bufferedReader = null;//7
try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String strLine = bufferedReader.readLine();
System.out.println(strLine);//9
if ("byebye".equals(strLine)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9000);//1
System.out.println("服务器端等待建立链接");//2
socket = serverSocket.accept();//block //3
System.out.println("链接已建立,读取数据");
RecvThread recvThread = new RecvThread();
recvThread.start();
SendThread sendThread = new SendThread();
sendThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面写了一个发送消息的线程,还有一个接收消息并显示的线程。
这是ServerCode,接下来要创建ClientCode,代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ClientCode {
static Socket socket = null;
//发送消息的线程
private static class SendThread extends Thread {
@Override
public void run() {
PrintStream p = null;//6
try {
p = new PrintStream(socket.getOutputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String strLine = bufferedReader.readLine();
p.println(strLine);//10
if ("byebye".equals(strLine)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();//13
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//接收消息并显示的线程
private static class RecvThread extends Thread {
@Override
public void run() {
BufferedReader bufferedReader = null;//7
try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String strLine = bufferedReader.readLine();
System.out.println(strLine);//9
if ("byebye".equals(strLine)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
socket = new Socket("127.0.0.1", 9000);//4
//BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
RecvThread recvThread = new RecvThread();
recvThread.start();
SendThread sendThread = new SendThread();
sendThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是第二个程序,详细简答写在了代码注释中,这样就实现了一个简单的通讯程序了,当然,可以在区域网内连接对方的ip地址,快和小伙伴们一起玩起来吧。
#接下来有一篇用相关代码连接数据库,并进行相关增删改查的操作,敬请期待吧,希望本文对各位有所帮助,共同进步!!!