许多学习java SE的小伙伴可能会羡慕学java web的小伙伴——他们能进行前后端交互,看着就很厉害的样子。而学会json的小伙伴可能会尝试使用类似web的方法通过json来进行数据传输。但实际上,java提供了一种更加高效的程序间传输数据的方式,这就是socket。接下来的文章,小编将用一个socket的实际项目,来让各位小伙伴了解什么是socket网络编程。
什么是socket?
socket,中文翻译为套接字。它是一种对网络中不同主机上的应用进程(或者相同主机的不同应用进程)之间进行双向通信的端点的抽象。实际上就是两个网络各种通信连接中的端点。它的作用就是完成应用间的数据传输。
套接字技术简单的来讲就是通过socket,将两个应用进行连接,连接之后就能进行数据传输了。socket只是实现连接的方法。
小编认为套接字这个翻译并不能直接反映出这门技术的特点(过于生涩),socket可以被翻译为插座,而实际上套接字技术更像是软件上的“插座”和“插头”。汉语中的套接,是一种水管对接的技术,使用一个套接管将两端的水管连接起来,这种技术就叫套接,所以是不是能理解什么是套接字了呢?
更多关于socket协议的介绍,可以前往websocket协议进行查看。
怎么使用socket?
不同语言实现套接字的方式不同,java有专门实现套接字的包。只需要import
相应的包,就可以进行套接字编程。
创建socket连接后可以通过getInputStream()
和getOutputStream()
的方法来获取和发送socket之间传输的数据。
接下来就用一个实例代码来介绍一下怎么使用socket吧!
socket项目实战
server.java
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(8888);
//在8888端口上监听,看是否有连接请求过来
System.out.println("开启服务端");
Socket accept = serverSocket.accept();
//获取socket连接
System.out.println("有连接过来"+accept);
Thread thread1 = new Thread(){//使用多线程来进行收发,线程1用来接收消息
@Override
public void run() {
try {
InputStream inputStream = accept.getInputStream();//获取socket输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//把输入流封装在DataInputStream
while (true){
String msg = dataInputStream.readUTF();//使用readUTF读取字符串
System.out.println("监听客户端消息: "+msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread2 = new Thread(){//线程2用来发送消息
@Override
public void run() {
try {
OutputStream outputStream = accept.getOutputStream();
//打开输出流
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//把输出流封装在DataOutputStream中
Scanner scanner = new Scanner(System.in);
while (true){
String strServer = scanner.next();
dataOutputStream.writeUTF(strServer);//使用writeUTF发送字符串
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread1.start();
thread2.start();
thread1.join();
System.out.println("服务器关闭");
accept.close();//关闭单个socket连接
serverSocket.close(); //关闭这个socket 服务器
} catch (Exception e) {
System.out.println("断开连接");
}
}
}
client.java
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
String host = "127.0.0.1";//目标电脑的ip地址,这里的地址是本机地址
int port = 8888;//目标电脑的端口
boolean flag = true;
try {
Socket socket = new Socket(host, port);//创建目标连接,传入ip地址和端口号
System.out.println("开启客户端");
Thread thread1 = new Thread() {//使用多线程方法来实行收发,线程1负责接收信息
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();//获取socket输入流
DataInputStream dataInputStream = new DataInputStream(inputStream);
//把输入流封装在DataInputStream
while (true) {
String msg = dataInputStream.readUTF();//使用readUTF读取字符串
System.out.println("接收服务端消息: " + msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread2 = new Thread() {//线程2用来发送消息
@Override
public void run() {
try {
OutputStream outputStream = socket.getOutputStream();
//打开输出流
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
//把输出流封装在DataOutputStream中
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.next();
dataOutputStream.writeUTF(str);//使用writeUTF发送字符串
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread1.start();
thread2.start();
thread1.join();
System.out.println("客户端关闭");
socket.close();//关闭这个socket
} catch (Exception e) {
System.out.println("断开连接");
}
}
}
上述代码涉及到多线程的知识,如果对多线程有所疑问,可以前往java多线程编程进行学习。如果理解不了socket代码,也可以前往java网络编程进行学习。
小结
以上就是Java实现socket通信的方法。掌握socket通信对于java的多端开发(比如服务器客户端,或者两个点对点应用)是十分重要的,各位小伙伴一定要好好学习啊。