电脑计算机论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2222|回复: 0

Socket服务器与客户端通讯介绍

[复制链接]
品牌设计 发表于 2012-3-13 15:16:51 | 显示全部楼层 |阅读模式
  服务器端代码:

  /** * Socket通讯服务器端 */ public class ServerMain { public ServerMain() { // 构造服务器ServerSocket对象,参数为服务器端开放的端口号 ServerSocket ss = new ServerSocket(8080); System.out.println("服务器准备就绪!"); // 死循环可以使服务器持续处于接收客户端状态 while(true){ // 该方法使程序阻塞,等待客户端的链接,当监听到客户端的链接,创建一个Socket对象与客户端单独会话 Socket s = ss.accept(); // 为了不影响服务器监听其它客户端,这里开启了一个线程,由线程处理与这个北京VI设计客户端的会话 new ServerThread(s).start(); } } public static void main(String[] args) { new ServerMain(); } } /** * 服务器端与客户端会话的线程 */ class ServerThread extends Thread { private Socket s = null; private BufferedReader read = null; private PrintStream print = null; public ServerThread(Socket s) { // 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流 read = new BufferedReader(new InputStreamReader(s.getInputStream())); print = new PrintStream(s.getOutputStream()); } /** * 线程的运行run方法 */ public void run() { String message = null; // 这里循环可以使服务器持续的接收客户端信息。read.readLine()通过输入流读取一段字符串,赋值给message变量,如果message字符串不为“exit”则循环,否则结束循环 while (!(message = read.readLine()).equals("exit")){ // 将字符串前面添加“返回:”,再发回客户端 print.println("返回:" + message); } s.close(); } }

  客户端代码:

  * Socket通讯客户端

  public class ClientMain { public ClientMain() { try { // 构造与服务器通讯的Socket对象,参数为服务器IP地址(String)和端口号(int),北京工业设计端口号需要和服务器端开放的端口号对应 Socket s = new Socket("192.168.1.100", ); // 启动一个线程与服务器通讯,并把链接服务器的Socket对象传递过去 new LinkThread(s).start(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new ClientMain(); } } /** * 与服务器通讯的线程 */ class LinkThread extends Thread { private Socket s = null; // 输出流 private PrintStream out = null; // 缓冲输入流 private BufferedReader in = null; // 录入文字的Scanner对象 private Scanner scanner = null; public LinkThread(Socket s) { // 将Socket对象实例保存在全局变量中,因为run方法中我们还要用它断开链接

  // 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流 out = new PrintStream(s.getOutputStream()); in = new BufferedReader(new InputStreamReader(s.getInputStream())); } /** * 线程的运行run方法 */ public void run() { scanner = new Scanner(System.in); System.out.println("提示:如果要结束本次会话,请输入“exit”指令!"); while(true){ System.out.print("请输入:"); String message = scanner.nextLine(); // 通过输出流发送字符串 out.println(message); // 清空缓冲,强制输出 out.flush(); // 获取服务器返回的字符串 String str = in.readLine(); // 如果返回的字符串存在 if(str != null){ // 显示在控制台 System.out.println(str); }else{ // 提示会话结束,并结束线程 System.out.println("本次会话结束!"); return; } } s.close(); } }
您需要登录后才可以回帖 登录 | 注册

本版积分规则


QQ|手机版|小黑屋|电脑计算机论坛 ( 京ICP备2022023538号-1 )

GMT+8, 2024-11-27 11:48 , Processed in 0.096017 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表