一个Java 的 Socket 服务器和客户端通信的例子

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

package com.defonds.socket.begin;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

public static final int PORT = 12345;//监听的端口号

public static void main(String[] args) {

System.out.println(”服务器启动…\n”);

Server server = new Server();

server.init();

}

public void init() {

try {

ServerSocket serverSocket = new ServerSocket(PORT);

while (true) {

// 一旦有堵塞, 则表示服务器与客户端获得了连接

Socket client = serverSocket.accept();

// 处理这次连接

new HandlerThread(client);

}

} catch (Exception e) {

System.out.println(”服务器异常: ” + e.getMessage());

}

}

private class HandlerThread implements Runnable {

private Socket socket;

public HandlerThread(Socket client) {

socket = client;

new Thread(this)。start();

}

public void run() {

try {

// 读取客户端数据

DataInputStream input = new DataInputStream(socket.getInputStream());

String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException

// 处理客户端数据

System.out.println(”客户端发过来的内容:” + clientInputStr);

// 向客户端回复信息

DataOutputStream out = new DataOutputStream(socket.getOutputStream());

System.out.print(”请输入:\t”);

// 发送键盘输入的一行

String s = new BufferedReader(new InputStreamReader(System.in))。readLine();

out.writeUTF(s);

out.close();

input.close();

} catch (Exception e) {

System.out.println(”服务器 run 异常: ” + e.getMessage());

} finally {

if (socket != null) {

try {

socket.close();

} catch (Exception e) {

socket = null;

System.out.println(”服务端 finally 异常:” + e.getMessage());

}

}

}

}

}

} 客户端源代码:

[java] view plaincopyprint?

01.package com.defonds.socket.begin;

02.

03.import java.io.BufferedReader;

04.import java.io.DataInputStream;

05.import java.io.DataOutputStream;

06.import java.io.IOException;

07.import java.io.InputStreamReader;

08.import java.net.Socket;

09.

10.public class Client {

11. public static final String IP_ADDR = “localhost”;//服务器地址

12. public static final int PORT = 12345;//服务器端口号

13.

14. public static void main(String[] args) {

15. System.out.println(”客户端启动…”);

16. System.out.println(”当接收到服务器端字符为 \”OK\” 的时候, 客户端将终止\n”);

17. while (true) {

18. Socket socket = null;

19. try {

20. //创建一个流套接字并将其连接到指定主机上的指定端口号

21. socket = new Socket(IP_ADDR, PORT);

22.

23. //读取服务器端数据

24. DataInputStream input = new DataInputStream(socket.getInputStream());

25. //向服务器端发送数据

26. DataOutputStream out = new DataOutputStream(socket.getOutputStream());

27. System.out.print(”请输入: \t”);

28. String str = new BufferedReader(new InputStreamReader(System.in))。readLine();

29. out.writeUTF(str);

30.

31. String ret = input.readUTF();

32. System.out.println(”服务器端返回过来的是: ” + ret);

33. // 如接收到 “OK” 则断开连接

34. if (”OK”.equals(ret)) {

35. System.out.println(”客户端将关闭连接”);

36. Thread.sleep(500);

37. break;

38. }

39.

40. out.close();

41. input.close();

42. } catch (Exception e) {

43. System.out.println(”客户端异常:” + e.getMessage());

44. } finally {

45. if (socket != null) {

46. try {

47. socket.close();

48. } catch (IOException e) {

49. socket = null;

50. System.out.println(”客户端 finally 异常:” + e.getMessage());

51. }

52. }

53. }

54. }

55. }

56.}

package com.defonds.socket.begin;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

public class Client {

public static final String IP_ADDR = “localhost”;//服务器地址

public static final int PORT = 12345;//服务器端口号

public static void main(String[] args) {

System.out.println(”客户端启动…”);

System.out.println(”当接收到服务器端字符为 \”OK\” 的时候, 客户端将终止\n”);

while (true) {

Socket socket = null;

try {

//创建一个流套接字并将其连接到指定主机上的指定端口号

socket = new Socket(IP_ADDR, PORT);

//读取服务器端数据

DataInputStream input = new DataInputStream(socket.getInputStream());

//向服务器端发送数据

DataOutputStream out = new DataOutputStream(socket.getOutputStream());

System.out.print(”请输入: \t”);

String str = new BufferedReader(new InputStreamReader(System.in))。readLine();

out.writeUTF(str);

String ret = input.readUTF();

System.out.println(”服务器端返回过来的是: ” + ret);

// 如接收到 “OK” 则断开连接

if (”OK”.equals(ret)) {

System.out.println(”客户端将关闭连接”);

Thread.sleep(500);

break;

}

out.close();

input.close();

} catch (Exception e) {

System.out.println(”客户端异常:” + e.getMessage());

} finally {

if (socket != null) {

try {

socket.close();

} catch (IOException e) {

socket = null;

System.out.println(”客户端 finally 异常:” + e.getMessage());

}

}

}

}

}

}

注意: Socket 输出流写数据方法是 writeUTF 时,输入流读取相关数据要用 readUTF.否则会抛 EOFException 异常。具体原因请参考文后链接。

[1][2]

一个人,一条路,人在途中,心随景动,

一个Java 的 Socket 服务器和客户端通信的例子

相关文章:

你感兴趣的文章:

标签云: