Socket通讯
服务器:
package day2.socket;
/*
聊天室的服务端
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* 运行在服务端的java.net.ServerSocket主要有两个工作:
* 1:向系统申请服务端口,客户端就是通过这个端口与服务器建立连接的
* 2:监听该服务器端口,一旦一个客户端连接就会自动创建一个Socket
* 相当于"接起一个电话".通过这个Socket与客户端交互
*
* 我们吧Socket想成一个电话,而ServerSocket则是总机.
*/
private ServerSocket server;
public Server() {
try {
/**
* 实例化ServerSock的同时需要指定服务器端口,如果该端口已经被系统其他程序占用时抛出异常
* java.net.BindException:Address already in use
*/
System.out.println("正在启动服务器");
server = new ServerSocket(8888);
System.out.println("服务器已经启动完成!");
}catch (IOException e){
e.printStackTrace();
}
}
public void start(){
try {
/**
* ServerSocket提供的方法:
* Socket accept()
* 这个方法是阻塞方法,调用后就“卡住了”直到一个客户端连接
* 该方法会立即返回一个Socket,通过这个Socket就可以和刚
* 建立连接的客户交互
*/
while (true){
System.out.println("等待客户端连接...");
Socket socket = server.accept();
System.out.println("一个客户端连接了!");
InputStream in =socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"utf-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine())!=null){
System.out.println("客户端说:"+line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server =new Server();
server.start();
}
}
客户端:
package day2.socket;
/*
聊天室的客户端
*/
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class Client {
/**
* java.net.socket 套接字
* Socket封装了TCP协议的通讯细节,使用它可以和远端计算机建立连接
* 并利用两个流的读写完成与远端计算机的数据交互
*/
private Socket socket;
/*
构造方法,用于初始化客户端
*/
public Client() {
try{
/**
* 实例化Socket时需要两个参数:
* 参数1:服务器IP地址信息,"localhost"是一种特殊的写法
* 表示本机地址
* 参数2:服务器打开的端口,数字取值范围1-65535之间
*
* 通过Ip我们可以找到网络上的服务器端所在计算机,通过端口可以连接到该计算机上的服务端应用程序
*/
System.out.println("正在连接服务端...");
socket = new Socket("192.168.43.60",8080);//建议用8000以后的号;localhost是自己连接自己
System.out.println("与服务器建立连接!");
}catch (IOException e){
e.printStackTrace();
}
}
/**
* 客户端开始工作的方法
*
*/
public void start(){
try {
/**
* Socket提供的方法:
* OutputStream getOutputStream()
* 该方法会返回一个字节输出流,通过这个输出流写出的字节会发送给远端计算机
*/
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw =new PrintWriter(bw,true);
// pw.println("你好服务器!");
Scanner scanner =new Scanner(System.in);
while (true){
String line = scanner.nextLine();
if ("exit".equals(line)){
break;
}
pw.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}