首先是建立简单的连接并发送信息。
发送中文信息的方法有多种。比如
使用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();
}
}
}