关于java的Socket编程复习

首先是建立简单的连接并发送信息。

发送中文信息的方法有多种。比如

使用DataOutputStream的writeUTF发送信息;使用DataInputStream的readUTF接受信息;

或者 使用Write字符流发送信息,使用Reader字符流接受信息。


顺便复习一下IO流,InputStreamReader和OutputStreamWriter分别是 字符流转换成字节流 和字节流转换成字符流 的桥梁。

转换顺序一般为:

InputStream -->  InputStreamReader  -->  BufferedReader     write()

OutputStream  -->  OutputStreamWriter  -->  BufferedWriter read()


服务器代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(6000);
			
			//阻塞,直到有客户端连接。
			Socket client = server.accept();
			
			DataOutputStream dos = new DataOutputStream(client.getOutputStream());
			dos.writeUTF("欢迎连接,我是Server!");
			
			DataInputStream dis = new DataInputStream(client.getInputStream());
			System.out.println(dis.readUTF());
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

客户端代码
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	public static void main(String[] args) {
		try {
			Socket client = new Socket("127.0.0.1",6000);
			
			DataInputStream dis = new DataInputStream(client.getInputStream());
			System.out.println(dis.readUTF());
			
			DataOutputStream dos = new DataOutputStream(client.getOutputStream());
			dos.writeUTF("Hello Server,I'm Client!");
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

接下来,要实现服务端和客户端的持续交互。主要思路是:线程。

当服务器和客户端连接成功时,在服务器和客户端分别开始两个线程,ReceiveThread和SendThread,以便接收或者发送消息。

接收/发送信息线程


//接收信息线程
class ReceiveThread implements Runnable{
	private DataInputStream dis;
	private boolean status;		//连接状态
	
	public ReceiveThread(DataInputStream dis,boolean status){
		this.dis = dis;
		this.status = status;
	}
	
	@Override
	public void run() {
		while(status){
			try {
				System.out.println(dis.readUTF());
			} catch (IOException e) {
				System.out.println("接收信息失败!");
			}
		}
	}
	
	public void setStatus(boolean status){
		this.status=status;
	}
}


//发送消息线程
class SendThread implements Runnable{
	private DataOutputStream dos;
	private boolean status;
	public SendThread(DataOutputStream dos,boolean status){
		this.dos = dos;
		this.status = status;
	}
	
	@Override
	public void run() {
		Scanner s = new Scanner(System.in);
		while(status){
			String str = s.nextLine();
			try {
				dos.writeUTF(str);
				dos.flush();
			} catch (IOException e) {
				System.out.println("发送消息失败!");
			}
			
		}
	}
	
	public void setStatus(boolean status){
		this.status=status;
	}
}

当然,上面几段代码健壮性不可观,但主要思路已经清晰。最后服务器、客户端代码为:
服务器
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(6000);
			//一直处于监听状态
			while(true){
				Socket client = server.accept();
				//新建一个连接线程
				new Thread(new Connect(client)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class Connect implements Runnable{
	private Socket client;
	private DataInputStream dis;
	private DataOutputStream dos;
	private boolean status;		//连接状态
	
	public Connect(Socket client){
		this.client = client;
		status = true;
		try {
			dis = new DataInputStream(client.getInputStream());
			dos = new DataOutputStream(client.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		try {
			dos.writeUTF("欢迎连接,我是Server!");

			//分别开始接收/发送消息的线程
			Runnable receiveThread = new ReceiveThread(dis, true);
			Runnable sendThread = new SendThread(dos, true);
			new Thread(receiveThread).start();
			new Thread(sendThread).start();
			
		} catch (IOException e) {
			System.out.println("接收消息失败!");
		}
	}
}




客户端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		try {
			Socket client = new Socket("127.0.0.1",6000);
			
			DataInputStream dis = new DataInputStream(client.getInputStream());
			System.out.println(dis.readUTF());
			
			DataOutputStream dos = new DataOutputStream(client.getOutputStream());
			dos.writeUTF("Hello Server,I'm Client!");
			dos.flush();
			
			//分别开始接收/发送消息的线程
			Runnable receiveThread = new ReceiveThread(dis, true);
			Runnable sendThread = new SendThread(dos, true);
			new Thread(receiveThread).start();
			new Thread(sendThread).start();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}



猜你喜欢

转载自blog.csdn.net/laichj/article/details/52485346