JAVA網路程式設計實戰應用——雙向聊天(執行緒)
阿新 • • 發佈:2018-12-21
控制檯雙向聊天
Code
以下如果有些流不懂的話,看我之前關於IO流的文章
要先啟動服務端(Server),再啟動客戶端(Client)
必須要保證埠一致
Socket socket = new Socket(“localhost”,9999);
主機我寫的是localhost,也就是本機
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
//客戶端
public class Client {
// static Socket socket = null;
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",9999);
//讀取服務端傳送過來的資料
new ClientReadThread(socket.getInputStream()).start();
//傳送給服務端資料
InputStream in = System.in;
new ClientWriteThread(in, socket).start();
//以下我也寫了一個執行緒,所以註釋了
/*int len;
byte[] byt = new byte[1024];
while ((len = in.read(byt)) != -1) {
//傳送資料
new PrintStream(socket.getOutputStream()).println(new String(byt, 0, len));
}*/
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
//讀的執行緒
public class ClientReadThread extends Thread{
private InputStream inputStream;
public ClientReadThread(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
//讀取資料 服務端傳送過來的資料
while (true) {
//使用緩衝流進行讀取
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
//讀一行
String readLine = bufferedReader.readLine();
System.out.println("客戶端收到訊息:" + readLine);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
//客戶端傳送資料的執行緒
public class ClientWriteThread extends Thread{
private InputStream inputStream;
private Socket socket;
public ClientWriteThread(InputStream inputStream, Socket socket) {
this.inputStream = inputStream;
this.socket = socket;
}
@Override
public void run() {
OutputStream os = null;
PrintStream printStream = null;
try {
os = socket.getOutputStream();
printStream = new PrintStream(os);
} catch (IOException e1) {
e1.printStackTrace();
}
int len;
byte[] byt = new byte[1024];
try {
while ((len = inputStream.read(byt)) != -1) {
//傳送資料
printStream.println(new String(byt, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if (printStream != null)
printStream.close();
try {
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//服務端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
static ServerSocket serverSocket = null;
static Socket accept = null;
public static void main(String[] args) throws IOException {
serverSocket = new ServerSocket(9999);
//建立連線
accept = serverSocket.accept();
//讀取客戶端傳送過來的資料
new ServerReadThread(accept.getInputStream()).start();
//傳送資料
OutputStream outputStream = accept.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
InputStream in = System.in;
int len;
byte[] byt = new byte[1024];
while ((len = in.read(byt)) != -1) {
//傳送資料
printStream.println(new String(byt, 0, len));
}
}
}
//服務端接收資料的執行緒
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ServerReadThread extends Thread {
private InputStream inputStream;
public ServerReadThread(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public void run() {
while (true) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
String readLine = bufferedReader.readLine();
System.out.println("伺服器收到訊息:" + readLine);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}