项目推荐
推荐个人GItHub开源项目(iot-dc3)一个开源的、分布式的物联网(IOT)平台,用于快速开发物联网项目和管理拓展。https://github.com/pnoker/iot-dc3
好久都没写博客有点手生啊,上周实训课,实训老师讲到了Java Socket,于是乎我就想试试用它实现一下通讯,结果果真如此啊!
接下来我们进入正题吧
##什么是套接字
本人一向崇尚简介,其实套接字就是为两台计算机之间的通信提供一种机制,是一种软件抽象,用于表达两台机器之间的连接“终端”。对于一个给定的连接,每台机器上都有一个套接字,您也可以想象它们之间有一条虚拟的“电缆”,“电缆”的每一端都插入到套接字中。当然,机器之间的物理硬件和电缆连接都是完全未知的。抽象的全部目的是使我们无须知道不必知道的细节。。
##套接字在什么地方
套接字大概是驻留在OSI的会话层,会话层夹在其上面向应用的层和其下的实时数据通信层之间。会话层为两台计算机之间的数据流提供管理和控制服务。作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。
##套接字有哪些类型
一般而言,Java 语言中的套接字有以下两种形式:
- TCP 套接字(由 Socket 类实现,稍后我们将讨论这个类)
- UDP 套接字(由 DatagramSocket 类实现)
TCP 和 UDP 扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。
一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。
因为多数读者都喜欢 TCP 胜过 UDP,所以我们将把讨论限制在 Java 语言中面向 TCP 的类。
##已经介绍完了,相比你已经知道了个大概,那么我就开始来个实例
在Eclipse中新建两个Java工程,一个是客户端一个是服务端,客户端就负责发送数据,服务端就负责接收数据(主要是为了简单所以很单一,如果你想同时即可接受也可发送就把两个代码相互结合一下就OK),一下是我的代码
Client.java
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
public class Client {
public static void main(String args[]) throws Exception {
// 抛异常
String host = "192.168.75.129"; // 服务器在同一个网段中
int port = 0x1111; // 连接服务器对应的监听端口
Socket client = new Socket(host, port);
Writer writer = new OutputStreamWriter(client.getOutputStream());// 写操作
writer.write("1");// 向服务器发送字符串
writer.flush();
/**
* Reader reader = new InputStreamReader(client.getInputStream());//读操作
* char chars[] = new char[64]; int len; StringBuffer content = new
* StringBuffer(); String temp; int index; while
* ((len=reader.read(chars)) != -1) {//判断结束标志“eof temp = new
* String(chars, 0, len); if ((index = temp.indexOf("eof")) != -1) {
* content.append(temp.substring(0, index)); break; } content.append(new
* String(chars, 0, len)); } System.out.println("from server: " +
* content);
**/
writer.close();// 关闭写操作
//reader.close();// 关闭读操作
client.close();// 关闭客户端
}
}
Server.java
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String args[]) throws IOException {
int port = 0x1111;
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[64];
int len;
StringBuilder content = new StringBuilder();
String temp = null;
int index;
while ((len = reader.read(chars)) != -1) {
temp = new String(chars, 0, len);
content.append(temp);
}
int s = Integer.parseInt(temp);
switch (s) {
case 1:
System.out.println("********************Led1 on");
break;
case 2:
System.out.println("********************Led2 on");
break;
case 3:
System.out.println("********************Led3 on");
break;
case 4:
System.out.println("********************Led4 on");
break;
}
reader.close();
socket.close();
server.close();
/**
* Writer writer = new OutputStreamWriter(socket.getOutputStream());
* writer.write("I am Server,are you Client?."); writer.flush();
* writer.close();
*
* reader.close();
* socket.close();
* server.close();
**/
}
}
运行一下,诶,不错哦!