java网络编程一:Socket用法,简单模拟一对一聊天

1、socket和serverSocket通信简单介绍如下,注意客户端与服务器端是怎么交换数据的

 

 

 

2、模拟qq聊天功能,实现客户端与服务器(一对一)的聊天功能

服务器端代码:

  1. <span style="font-size:16px;">package demo.net;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8. import java.util.Scanner;  
  9.   
  10. /** 
  11.  * 模拟qq聊天功能: 实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示, 
  12.  * 然后服务器端也可以输入信息,同样信息也在客户端和服务器端显示 
  13.  */  
  14.   
  15. // 服务器类  
  16. public class ChatServer {  
  17.     private int port = 8189;// 默认服务器端口  
  18.   
  19.     public ChatServer() {  
  20.     }  
  21.   
  22.     // 创建指定端口的服务器  
  23.     public ChatServer(int port) {  
  24.         this.port = port;  
  25.     }  
  26.   
  27.     // 提供服务  
  28.     public void service() {  
  29.         try {// 建立服务器连接  
  30.             ServerSocket server = new ServerSocket(port);  
  31.             // 等待客户连接  
  32.             Socket socket = server.accept();  
  33.             try {  
  34.                 // 读取客户端传过来信息的DataInputStream  
  35.                 DataInputStream in = new DataInputStream(socket  
  36.                         .getInputStream());  
  37.                 // 向客户端发送信息的DataOutputStream  
  38.                 DataOutputStream out = new DataOutputStream(socket  
  39.                         .getOutputStream());  
  40.                 // 获取控制台输入的Scanner  
  41.                 Scanner scanner = new Scanner(System.in);  
  42.                 while (true) {  
  43.                     // 读取来自客户端的信息  
  44.                     String accpet = in.readUTF();  
  45.                     System.out.println(accpet);  
  46.                     String send = scanner.nextLine();  
  47.                     System.out.println("服务器:" + send);  
  48.                     // 把服务器端的输入发给客户端  
  49.                     out.writeUTF("服务器:" + send);  
  50.                 }  
  51.             } finally {// 建立连接失败的话不会执行socket.close();  
  52.                 socket.close();  
  53.             }  
  54.         } catch (IOException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.     }  
  58.   
  59.     public static void main(String[] args) {  
  60.         new ChatServer().service();  
  61.     }  
  62. }  
  63. </span>  


 

客户端代码:

  1. <span style="font-size:16px;">package demo.net;  
  2.   
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.Socket;  
  7. import java.util.Scanner;  
  8.   
  9. /** 
  10.  * 注意用到的输入输出流DataInputStream和DataOutputStream,成对出现,最好用字节流 
  11.  */  
  12. // 客户端类  
  13. public class ChatClient {  
  14.     private String host = "localhost";// 默认连接到本机  
  15.     private int port = 8189;// 默认连接到端口8189  
  16.   
  17.     public ChatClient() {  
  18.   
  19.     }  
  20.   
  21.     // 连接到指定的主机和端口  
  22.     public ChatClient(String host, int port) {  
  23.         this.host = host;  
  24.         this.port = port;  
  25.     }  
  26.   
  27.     public void chat() {  
  28.         try {  
  29.             // 连接到服务器  
  30.             Socket socket = new Socket(host, port);  
  31.   
  32.             try {  
  33.                 // 读取服务器端传过来信息的DataInputStream  
  34.                 DataInputStream in = new DataInputStream(socket  
  35.                         .getInputStream());  
  36.                 // 向服务器端发送信息的DataOutputStream  
  37.                 DataOutputStream out = new DataOutputStream(socket  
  38.                         .getOutputStream());  
  39.   
  40.                 // 装饰标准输入流,用于从控制台输入  
  41.                 Scanner scanner = new Scanner(System.in);  
  42.   
  43.                 while (true) {  
  44.                     String send = scanner.nextLine();  
  45.                     System.out.println("客户端:" + send);  
  46.                     // 把从控制台得到的信息传送给服务器  
  47.                     out.writeUTF("客户端:" + send);  
  48.                     // 读取来自服务器的信息  
  49.                     String accpet = in.readUTF();  
  50.                     System.out.println(accpet);  
  51.                 }  
  52.   
  53.             } finally {  
  54.                 socket.close();  
  55.             }  
  56.         } catch (IOException e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60.   
  61.     public static void main(String[] args) {  
  62.         new ChatClient().chat();  
  63.     }  
  64. }  
  65. </span>  


 

运行结果:

 

   

 

注意运行的时候要先开服务器,再开客户端,聊天由客户端发起。运行结果中绿色的字表示输入。

 

 看完了,失望了吧,本人十月份开始看java的(以前有一点初步的了解),从《java常用类解析一:System类、Object类、Arrays类、Cloneable接口》到《java网络编程》系列。此篇文章的本意是熟悉一下socket编程的,但看了评论之后我决定写一个有界面实现部分qq功能的聊天工具软件,各位大神,看完之后如果觉得被忽悠了就给点思路吧!thank you!

posted @ 2012-01-19 16:12  王爵的技术博客  阅读(14682)  评论(2编辑  收藏  举报

我的技术博客:https://biezhi.me

Github:https://github.com/biezhi 

微博:http://weibo.com/u/5238733773

Twitter:https://twitter.com/biezhii