Java网络编程:实战Scoket与ServerSocket
一、Scoket与ServerSocket
java中使用网络编程的话可以使用Scoket或者是ServerSocket
- ServerSocket.class是用来代表服务器端的Socket,需要bind绑定端口,阻塞式调用accpet函数,等待客户端来建设连接,
- Scoket.class是用来代表客户端的Socket,可以要求与服务器要求进行连接connect,当连接成功的时候服务器端accpet函数会返回一个Socket对象,这个Socket就是服务器进程可以与客户端进程进行数据交流的端点
二、ServerSocket实战
public class Server {
public static void main(String[] args){
//使用8888做为监听端口
final int DEFAULT_PORT = 8888;
//服务器端使用ServerSocket
ServerSocket serverSocket = null;
try {
//bind绑定监听端口
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("启动服务器,监听端口:"+DEFAULT_PORT);
//等待连接
while(true){
//阻塞式调用accept
Socket socket = serverSocket.accept();
System.out.println("客户端Port:"+socket.getPort()+"连接完成");
//数据交换
//输入流,装饰器模式
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//读取客户端发送的消息,客户端socket出错的话返回null
String msg = reader.readLine();
if(msg!=null){
System.out.println("客户端Port:"+socket.getPort()+"发送的消息式:"+msg);
//回复客户端
writer.write("服务器发送消息:"+msg+"\n");
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(serverSocket != null){
try{
serverSocket.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
三、Socket实战
public class Client {
public static void main(String[] args){
final String DEFAULT_SERVER_HOST = "127.0.0.1";
final int DEFAULT_SERVER_PORT = 8888;
Socket socket = null;
BufferedWriter writer = null;
try {
//创建socket
socket = new Socket(DEFAULT_SERVER_HOST,DEFAULT_SERVER_PORT);
//创建IO流
//读取服务器端发送的内容
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//客户端发送信息给服务端
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//等待用户输入信息
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String input = consoleReader.readLine();
//发送给服务器
writer.write(input+"\n");
writer.flush();
//读取服务器返回的消息
String msg = reader.readLine();
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭最外层的BufferedWriter,会自动清空缓冲区,也会关闭Socket
if(writer != null){
try {
writer.close();
System.out.println("关闭客户端Socket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、运行简单的服务器客户端实例
4.1 编译
C:\Users\JessicaMaos>javac -encoding UTF-8 F:\untitled\src\Server.java
C:\Users\JessicaMaos>javac -encoding UTF-8 F:\untitled\src\Client.java
4.2 启动服务器
这时候服务器处于accept的阻塞状态,等待客户端的连接
F:\untitled\src>java Server
启动服务器,监听端口:8888
4.3 启动客户端,服务端连接成功
启动客户端
F:\untitled\src>java Client
服务端与客户端连接成功
客户端Port:10302连接完成
4.4 客户端输入消息
在客户端输入内容按回车
Jessica & Maomaos
4.5 服务端接收消息并返回
服务端便会接受到客户端发送过来的消息
客户端Port:10302发送的消息式:Jessica & Maomaos
我们程序中让服务端返回消息给客户端,所以客户端接收消息
服务器发送消息:Jessica & Maomaos
客户端关闭Socket
关闭客户端Socket
送过来的消息
客户端Port:10302发送的消息式:Jessica & Maomaos
我们程序中让服务端返回消息给客户端,所以客户端接收消息
服务器发送消息:Jessica & Maomaos
客户端关闭Socket
关闭客户端Socket