一、Socket服务端
1. 基本Socket服务端编程
基本流程:
- 创建服务端套接字,填入端口号
- 检测客户端的接入
- 获取输入流,用来读取数据
- 读取输入流中的数据
- 输出从客户端获取的数据
对应流程用代码实现:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {
public static void main(String[] args) {
byte[] data = new byte[128];
int len = 0;
try {
//1.创建服务端套接字,填入端口号
ServerSocket socket = new ServerSocket(8801);
System.out.println("socket套接字创建成功,等待连接~~~");
//2.检测客户端的接入
Socket con = socket.accept();
System.out.println("有客户端接入");
//3.获取输入流,用来读取数据
InputStream in = con.getInputStream();
//4.读取输入流中的数据
len = in.read(data);
//5.输出从客户端获取的数据
//String()方法将byte转化为字符串
System.out.println("读到消息:"+ new String(data, 0, len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
2. Socket服务端支持多连接
想要多连接必须创建新的线程来对接多个客户端,所以这里我们用到Java多线程,通过循环去不断监听客户端接入,然后创建新的线程去对接每个客户端。
实现代码:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {
public static void main(String[] args) {
try {
//1.创建服务端套接字,填入端口号
ServerSocket socket = new ServerSocket(8801);
System.out.println("socket套接字创建成功,等待连接~~~");
while(true){
//2.检测客户端的接入
final Socket con = socket.accept();
System.out.println("有客户端接入");
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
//3.获取输入流,用来读取数据
InputStream in;
try {
in = con.getInputStream();
int len = 0;
byte[] data = new byte[128];
//4.读取输入流中的数据
len = in.read(data);
//5.输出从客户端获取的数据
//String()方法将byte转化为字符串
System.out.println("读到消息:"+ new String(data, 0, len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
这里要注意,当客户端连接上以后,新的线程即被创建,当一条消息发送完毕的时候,该线程会自动结束,想要再次发送消息,必须再次建立连接,这就意味着,在以后安卓APP开发中,按一次屏幕上的按钮,一个客户端就会被接入,一个新的线程就会被创建,然后再进行通信。
二、Socket客户端
1. 基本Socket服务端编程
实现基本流程:
- 创建客户端套接字,填充ip地址和端口号
- 获取输出流,用来发送数据
- 键盘获取输入发送内容
- 发送数据
对应代码实现:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
try {
//1.创建客户端套接字,填充ip地址和端口号
Socket client = new Socket("192.168.0.15",8801);
//2.获取输出流,用来发送数据
OutputStream out = client.getOutputStream();
//3.键盘获取输入发送内容
Scanner sc = new Scanner(System.in);
String message = sc.next();
//4.发送数据
//用getBytes()方法将字符串转化为字节数组
out.write(message.getBytes());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
客户端:
服务端:
2. Socket客户端支持发送和接收
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
try {
//1.创建客户端套接字,填充ip地址和端口号
Socket client = new Socket("192.168.0.15",8880);
//2.获取输出流,用来发送数据
OutputStream out = client.getOutputStream();
//3.键盘获取输入发送内容
Scanner sc = new Scanner(System.in);
String message = sc.next();
//4.发送数据
//用getBytes()方法将字符串转化为字节数组
out.write(message.getBytes());
//5.获得数据接收通道
InputStream in = client.getInputStream();
int len;
byte[] data = new byte[128];
//6.读取数据
len = in.read(data);
System.out.println("获得服务端返回数据是:"+new String(data, 0, len));
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}