private class ClientRunnable implements Runnable{ @Override public void run() { try { InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in, "utf-8"); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } } }
时间: 2024-02-10 11:34:28 浏览: 33
这是一个Java内部类ClientRunnable,实现了Runnable接口,用于处理客户端接收消息的线程。在run()方法中,首先通过socket获取到输入流in,然后创建InputStreamReader对象isr,使用utf-8编码将in转换为字符流。接着,使用BufferedReader类包装isr,以便逐行读取数据。在while循环中,不断从缓冲流中读取一行数据,直到读取到的数据为空为止。每读取一行数据,就将其打印到控制台上。如果发生异常,则将异常打印出来。
相关问题
java socket多线程聊天程序
下面是一个简单的 Java socket 多线程聊天程序:
服务端代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress());
new Thread(new ChatHandler(socket)).start();
}
}
private static class ChatHandler implements Runnable {
private Socket socket;
public ChatHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
String msg = new String(buffer, 0, len);
System.out.println("收到客户端消息:" + msg);
out.write(("服务端已收到消息:" + msg).getBytes());
out.flush();
}
} catch (IOException e) {
System.out.println("与客户端断开连接:" + e.getMessage());
}
}
}
}
```
客户端代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
System.out.println("已连接到服务器:" + socket.getInetAddress().getHostAddress());
try (InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); Scanner scanner = new Scanner(System.in)) {
while (true) {
System.out.print("请输入消息:");
String msg = scanner.nextLine();
if ("quit".equals(msg)) {
break;
}
out.write(msg.getBytes());
out.flush();
byte[] buffer = new byte[1024];
int len = in.read(buffer);
System.out.println("收到服务端消息:" + new String(buffer, 0, len));
}
} catch (IOException e) {
System.out.println("与服务器断开连接:" + e.getMessage());
}
}
}
```
运行程序后,先启动服务端,然后启动多个客户端,客户端输入消息后,服务端会将消息原样返回给客户端。
4. 使用TCP网络程序上传图片:编写服务器类PicUploadServer,该类包含一个Socket类型的私有属性,并提供了该属性的有参构造方法。PicUploadServer类实现Runnable接口,重写run()方法,在run()方法内读取客户端上传的图片,并将图片存入服务器指定文件夹中。编写客户端类PicUpLoadClient,该类实现了读取指定图片,向指定端口发送图片数据的功能。 编写测试类Example03,在main()方法中,通过指定的端口号创建ServerSocket对象,并编写死循环,在死循环中,通过ServerSocket对象获取Socket对象,并开启线程服务。
以下是PicUploadServer类的代码实现:
```java
import java.io.*;
import java.net.*;
public class PicUploadServer implements Runnable {
private Socket socket;
public PicUploadServer(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = new FileOutputStream("D:/pic.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
System.out.println("图片上传成功!");
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
以下是PicUpLoadClient类的代码实现:
```java
import java.io.*;
import java.net.*;
public class PicUpLoadClient {
public static void main(String[] args) {
try {
File file = new File("D:/test.jpg");
FileInputStream in = new FileInputStream(file);
Socket socket = new Socket("localhost", 9999);
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
System.out.println("图片上传成功!");
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
最后,以下是Example03类的代码实现:
```java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Example03 {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
PicUploadServer server = new PicUploadServer(socket);
new Thread(server).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
我们通过Example03类的main()方法启动了一个服务器,监听9999端口。当客户端连接到该端口时,服务器会创建一个PicUploadServer对象,将Socket对象传递给该对象,并开启一个新的线程来处理客户端请求。客户端通过PicUpLoadClient类,将指定图片上传至服务器。服务器接收到客户端上传的图片后,将其存储在指定文件夹中。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)