Java网络编程Socket
网络编程实质
两个(或多个)设备(例如计算机)之间的数据传输。
Socket
socket是BSD UNIX的通信机制,通常称为“套接字”
Socket工作原理
对于服务器来说先初始化Socket再绑定端口,再对其端口监听,调用accept阻塞,等待客户端连接请求
对于客户端来说先初始化Socket,绑定端口和IP,然后申请连接。
客户端申请连接,服务器接受申请并回复申请许可,发送数据,关闭连接。这里涉及到TCP三次握手连接
实现代码
客户端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
private Scanner scanner = new Scanner(System.in);
private Socket socket;
private InputStream is;
private OutputStream os;
public Client() {
while(true){
try {
//获取socket对象,绑定端口
socket = new Socket("localhost",9999);
/***************向服务器发送信息*****************/
System.out.println("请输入向服务器发送的消息");
String str = scanner.next();
//获取输出流
os = socket.getOutputStream();
os.write(str.getBytes("utf-8"));
os.flush();
socket.shutdownOutput();
/****************发送信息到服务器结束******************/
//获取输入流
is = socket.getInputStream();
//缓存流存储数据
BufferedReader bu = new BufferedReader(new InputStreamReader(is,"utf-8"));
String str1 = bu.readLine();
System.out.println("服务器发送的信息为:"+str1);
//结束输入
socket.shutdownInput();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client();
}
}
服务器
package socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
private ServerSocket ss;
private Scanner scanner = new Scanner(System.in);
private Socket socket;
private InputStream is;
private OutputStream os;
public Server() {
try {
ss = new ServerSocket(9999);
System.out.println("服务器已启动");
while(true){
/************服务器接收信息**************/
//侦听客户端请求,获取socket
socket = ss.accept();
//获取输入流
is = socket.getInputStream();
//缓存流存储数据
BufferedReader bu = new BufferedReader(new InputStreamReader(is,"utf-8"));
String str = bu.readLine();
System.out.println("客户端传递的信息为:"+str);
//结束输入
socket.shutdownInput();
/**********服务器接收信息结束*********************/
/***************服务器发送信息*****************/
System.out.println("请输入向客户端发送的消息");
String str1 = scanner.next();
//获取输出流
os = socket.getOutputStream();
os.write(str1.getBytes("utf-8"));
os.flush();
socket.shutdownOutput();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server();
}
}