一個進程可以有多個線程
一個線程至少會有一個進程
extends Thread類
implements Runnable接口
重寫run()方法
啟動線程start():1.啟動一個線程 2.調用run()方法
區別:
繼承Thread類 資源不共享
實現Runnable接口 資源共享 還可以繼承其他類
創建對象時
繼承Thread類 直接new對象
實現Runnable接口 new Thread(構造參數:Runnable接口實現類對象);
--------------------------------------
Socket:套接字
java.net包
流式套接字:基於TCP協議的Socket網絡編程
---服務端(main方法):
ServerSocket serverSocket = new ServerSocket(5000); //創建服務端socket 5000端口
Socket socket = serverSocket.accept(); //等待通信
InputStream is = socket.getInputStream(); //得到輸入流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //把輸入流封裝成緩沖字符輸入流
String info;
while((info=br.readLine())!=null){
System.out.println(info);
}
OutputStream os = socket.getOutputStream();
String info = "服務端的消息";
byte[] infos = info.getBytes();
os.write(infos);
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
---客戶端(main方法):
Socket socket = new Socket("localhost",); //客戶端 參數1:連接到ip 本機localhost 參數2:服務端端口5000
OutputStream os = socket.getOutputStream(); //得到輸出流
String info = "客戶端的消息";
byte[] infos = info.getBytes();
os.write(infos);
socket.shutdownOutput(); //socket輸出完了要關閉
InputStream is = socket.getInputStream(); //得到輸入流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //把輸入流包裝成緩沖字符輸入流
String temp;
while((temp = br.readLine())!=null){
System.out.println(temp);
}
br.close();
is.close();
os.close();
socket.close();
//如果傳的是對象 首先user類需要實現序列化 public class User implements Serializable
客戶端
new user對象...
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.write(user);
oos.close();
服務端
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println(user.getUserName());
ois.close();
數據包式套接字:基於UDP協議的Socket網絡編程
=====================多線程==============
對應每個客戶請求 都要創建一個相應的線程
//線程類
public class LoginThread extends Thread{
private Socket socket;
public LoginTread(Socket socket){
this.socket = socket;
}
//處理客戶端請求
public void run(){
InputStream is = socket.getInputStream(); //得到輸入流
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println(user.getUserName());
OutputStream os = socket.getOutputStream();
String info = "服務端的消息";
byte[] infos = info.getBytes();
os.write(infos);
os.close();
ois.close();
is.close();
socket.close();
}
}
//服務端
---服務端(main方法):
ServerSocket serverSocket = new ServerSocket(5000); //創建服務端socket 5000端口
while(true){ //無限循環等待客戶的請求
Socket socket = serverSocket.accept(); //等待通信
LoginThread loginTread = new LoginThread(socket); //把每個客戶socket傳入新線程
loginThread.start(); //開啟線程
}
-----------
得到客戶端ip
InetAddress address = socket.getInetAddress();
String ip = address.getHostAddress();