Java多線程和網絡編程入門學習

多線程

Java中多線程的實現有兩種方式,一種是繼承extends Thread類,另一種是實現Runnable接口

而Thread類實現了Runnable接口,他們之間存在多態性,在Java中只有單繼承,而允許實現多個接口。所以常用作的創建線程的方法是實現Runnable接口。

下面是兩種方法的實現舉例:

繼承Thread類創建線程

public class ThreadTest {
    public static void main(String[] args) {
        MyThread thread = new MyThread() ;
        thread.start() ;
        int count = 5 ;
        while(count != 0) {
            count -- ;
            System.out.println("主線程在跑");
        }
}
//繼承thread類實現多線程方法
class MyThread extends Thread {
    public void run() {
        int count  = 10 ;
        while(count != 0) {
            count-- ;
            System.out.println("線程正在執行");
        }
    }
}

實現Runnable接口創建線程

public class ThreadTest {
    public static void main(String[] args) {
        MyThread thread = new MyThread() ;
        Thread t = new Thread(thread) ;
        t.start() ;
        int count = 5 ;
        while(count != 0) {
            count -- ;
            System.out.println("主線程在跑");
        }
}

//實現runnable接口
class MyThread implements Runnable {
    @Override
    public void run() {
    	int count = 10 ;
        while(count != 0) {
				count -- ;
	            System.out.println("線程在跑");
        }
    }
}

比較:
實現Runnable接口比繼承Thread類所具有的優勢:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):可以避免java中的單繼承的限制
3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立

基於TCP的Java網絡編程
直接說代碼

TCPServer作爲服務端

package ChatServer;

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

//tcp通信的服務器端,接受客戶端請求,讀取客戶端發送的數據
//表示服務器的類ServerSocket
//成員方法:socket accept
//服務器的實現步驟:
//創建服務器ServerSocket對象中的方法accept
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //創建服務器對象serverSocket對象和系統要指定的端口號
        ServerSocket server = new ServerSocket(8888) ;
        //使用serverSocket對象的方法accept,獲取到請求的客戶端對象socket
        Socket socket = server.accept() ;
        //使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端發送的數據
        InputStream  is = socket.getInputStream() ;
        byte[] bytes = new byte[1024] ;
        int len = is.read(bytes) ;
        //打印接收到的客戶端的數據
        System.out.println(new String(bytes, 0, len));
        //使用socket對象中的方法getOutputStream獲取網絡字節輸出流
        OutputStream os = socket.getOutputStream() ;
        //使用網絡字節輸出流outputStream對象中的方法write給客戶端回寫數據
        os.write("收到數據".getBytes()) ;
        socket.close() ;
        server.close() ;
    }
}

TCPClient作爲客戶端

package ChatClient;
//java網絡編程

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //創建一個客戶端對象socket,構造方法綁定服務器的IP地址和端口號
        Socket socket = null;
        try {
            //使用網絡字節輸出流outputstream獲取網絡字節輸出流outputstream對象
            socket = new Socket("127.0.0.1", 8888);

        } catch (IOException e) {
            e.printStackTrace();
        }
        OutputStream os = null;
        try {
        	//獲取socket的輸出流句柄
            os = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
        	//向服務端發送數據
            os.write("你好服務器".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //接收網絡數據的socket句柄
        InputStream is = socket.getInputStream() ;
        //定義好緩衝區
        byte[] bytes = new byte[1024] ;
		//接受服務端的數據
        int len = is.read(bytes) ;
        System.out.println("接收到服務器迴應:"+new String(bytes, 0, len));
		os..close() ;
		is.close() ;
        socket.close() ;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章