1. 程式人生 > >socket用執行緒實現客戶端和伺服器端連續傳送資料

socket用執行緒實現客戶端和伺服器端連續傳送資料

總共涉及到四個類。

其中包括,一個客戶端client,一個服務端server,

然後伺服器端和客戶端都有傳送和接收的功能,所以還有一個傳送類sendThread實現runnable介面,還有個接收類receiveThread實現runnable介面。

在客戶端client和服務端分別實現傳送和接收的工能就好了。

這是客戶端程式碼,註釋部分為不用執行緒的方法實現連線。

package qq;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
//總結,如果用執行緒的話1.可以讓傳送和接收這兩個方法非同步執行,互不干擾。
//2.可以傳送和接收這兩個方法一直處於活躍狀態。
//如果不用執行緒的話你會發現傳送和接收這兩個方法一定要按順序來。不能連續傳送兩次資料
public class QQClient {
	public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
		
		Socket s=new Socket("localhost",1994);
		SendThread st=new SendThread(s);
		new Thread(st).start();
		new Thread(new ReceiveThread(s)).start();
//		while(true){
//		ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
//		oos.writeObject(new Student(new Scanner(System.in).nextInt(),"2","1",25,"c1",100));
//		oos.flush();
//		
//		ObjectInputStream ois=new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
//		Student stu=(Student)ois.readObject();
//		System.out.println(stu.getBianhao());
//		
//		}
	}
}
然後是伺服器端程式碼,註釋部分也是不用執行緒的方法實現連線。
package qq;

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

public class QQServer {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ServerSocket ss=new ServerSocket(1994);
		Socket s=ss.accept();
		SendThread st=new SendThread(s);
		new Thread(st).start();
		new Thread(new ReceiveThread(s)).start();
//		while(true){
//			ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
//			oos.writeObject(new Student(new Scanner(System.in).nextInt(),"2","1",25,"c1",100));
//			oos.flush();
//		ObjectInputStream ois=new ObjectInputStream(new BufferedInputStream(s.getInputStream()));
//		Student stu=(Student)ois.readObject();
//		System.out.println(stu.getBianhao());
//			
//		
//		}
	}
}
然後是實現runnable介面傳送功能的類
package qq;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

import aboutsocket.Student;

public class SendThread implements Runnable{
	private Socket s;
	public SendThread(Socket s){
		this.s=s;
	}
	@Override
	public void run() {
		ObjectOutputStream oos=null;
		try {
			oos=new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
			while(true){
				oos.writeObject(new Student(new Scanner(System.in).nextInt(),"2","1",25,"c1",100));
				oos.flush();
			}
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		
	}
	
	
}
接收功能的
package qq;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

import aboutsocket.Student;

public class SendThread implements Runnable{
	private Socket s;
	public SendThread(Socket s){
		this.s=s;
	}
	@Override
	public void run() {
		ObjectOutputStream oos=null;
		try {
			oos=new ObjectOutputStream(new BufferedOutputStream(s.getOutputStream()));
			while(true){
				oos.writeObject(new Student(new Scanner(System.in).nextInt(),"2","1",25,"c1",100));
				oos.flush();
			}
		} catch (IOException e) {
			// TODO 自動生成的 catch 塊
			e.printStackTrace();
		}
		
	}
	
	
}
剛學習socket的時候可能會想為什麼一定要用執行緒來呢,即為什麼不直接使用上面註釋掉的程式碼呢?因為你執行完後會發現接收和傳送功能如果在一起的話,會按秩序執行,即只能客戶端發一句話,然後伺服器端接收完後伺服器端傳送一次,然後客戶端接收客戶端再發送一次,如此迴圈。那如果我想像QQ一樣能一個人連續說幾句話,那我們就要將傳送和接收兩個方法分開來,這就有了兩個執行緒將這兩個方法封裝起來,並且執行緒的話本身功能就有非同步的功能,即互不影響。這就可以實現客戶端連續傳送訊息。