设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 3502|回复: 13
打印 上一主题 下一主题

Socket 网络编程 [复制链接]

Rank: 8Rank: 8

跳转到指定楼层
1#
那个谁 发表于 2011-5-19 16:37:06 |只看该作者 |倒序浏览
套接字(socket)是代表计算机之间网络连接的对象。要进行计算机间的网络通讯,建立TCP连接,那么就需要Socket编程,Java提供了ServerSocket类和Socket类,可以利用他们很方便的实现,计算机间的网络通讯。

因为Java把数据的传输已经抽象成InputStream和OutputStream的输入输出流,那么对网络通讯来说,其实就是利用ServerSocket类和Socket类建立起来网络连接,进行字节流或者字符流的输入输出操作。

下面我们还是通过一个例子来学习Socket编程:只会装傻的”智能“机器人

直接上代码,服务器端 TalkServer.java :
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.ServerSocket;
  6. import java.net.Socket;

  7. public class TalkServer {

  8.         public static void main(String[] args) throws IOException {

  9.                 // 创建一个ServerSocket
  10.                 ServerSocket server = new ServerSocket(8080);

  11.                 // 准备接受客户连接,如果有客户连接到,则创建一个socket对象,如果没有客户连接到,那么该程序会停在本行一直等待,像是在睡眠或者假死,这种行为叫做“阻塞”,阻塞是网络通信中的术语,就是你等别人响应,如果必须等到,等不到就一直等,就是阻塞,等不到也继续向前走的当然就是非阻塞。
  12.                 Socket socket = server.accept();

  13.                 // 从socket中获取一个输入对象,以便接受从网络上来的数据
  14.                 BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

  15.                 // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据,如果想让服务器端和客户端自由对话的话可以用此对象
  16.                 //BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));

  17.                 // 从socket中获取一个
  18.                 PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

  19.                 //定义一些变量
  20.                 String input;               

  21.                 // 一直执行,直到客户端表示要断开
  22.                 while(true){
  23.                         //从客户端获取用户输入的字符串
  24.                         input = socketInput.readLine();
  25.                         //发送到屏幕
  26.                         System.out.print("客户:");
  27.                         System.out.println(input);                       

  28.                         //准备好回复语句
  29.                         String reply= reply(input);
  30.                         //发送到客户端
  31.                         socketOutput.println(reply);
  32.                         //发送到屏幕
  33.                         System.out.print("小瑶瑶:");
  34.                         System.out.println(reply);

  35.                         //客户如果输入的是再见则退出循环
  36.                         if(input.equals("再见")){
  37.                                 break;
  38.                         }
  39.                 }       

  40.                 //关闭释放资源
  41.                 socketInput.close();
  42.                 socketOutput.close();
  43.                 socket.close();

  44.         }

  45.         //回复方法
  46.         private static String reply(String input) {

  47.                 String output=replys[number%7];

  48.                 if(number%7==5){
  49.                         output = output+" "+input;
  50.                 }

  51.                 number++;
  52.                 return output;
  53.         }

  54.         //回复方法用到的一些变量
  55.         static int number =0;

  56.         static String[] replys = new String[7];

  57.         static{
  58.                 replys[0]= "你说的啥,我听不见?";
  59.                 replys[1]= "声音再大点行不?";
  60.                 replys[2]= "声音再大点一点点行不?";
  61.                 replys[3]= "还是听不清……";
  62.                 replys[4]= "看来是网络的问题,你要不说慢点?";
  63.                 replys[5]= "听到了!听到了!你说的是:";
  64.                 replys[6]= "完了,又听不清了……";
  65.         }

  66. }
  67.                
复制代码
客户端代码 TalkClient.java :
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;

  7. public class TalkClient {

  8.         public static void main(String[] args) throws UnknownHostException, IOException {

  9.                 Socket socket = new Socket("127.0.0.1",8080);

  10.                 // 从socket中获取一个输入对象,以便接受从网络上来的数据
  11.                 BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

  12.                 // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据
  13.                 BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));

  14.                 // 从socket中获取一个
  15.                 PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(),true);

  16.                 // 定义一些变量
  17.                 String input;               

  18.                 // 一直执行
  19.                 while(true){

  20.                         //从键盘获取数据,通过socket对象发送出去
  21.                         input = keyboardInput.readLine();
  22.                         socketOutput.println(input);

  23.                         //接收从socket中获取的服务器端发回的回应信息,并发送到屏幕上
  24.                         input = socketInput.readLine();
  25.                         System.out.println(input);
  26.                 }

  27.         }

  28. }               
复制代码
编译两个文件,先运行TalkServer,开始接收客户端的连接,然后运行客户端,在客户端上打字,服务器端会有回应,运行截图如下,这里上一个服务器端的截图:
image.png
1

查看全部评分

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

Rank: 8Rank: 8

2#
momo 发表于 2011-5-19 16:43:24 |只看该作者
杰杰小妹,把你的分让给我点,混混再给你分就给我昂!!!
过了爱做梦的年纪
轰轰烈烈不如平静

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

3#
Alvin 实名认证  发表于 2011-5-19 16:43:42 |只看该作者


杰管好样的啊。。。比我厉害多了

使用道具 举报

Rank: 8Rank: 8

4#
momo 发表于 2011-5-19 16:53:21 |只看该作者
回复 3# 混混@普宁.中国


    混混你偏心。。。。。。。。。。。。
过了爱做梦的年纪
轰轰烈烈不如平静

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

5#
Alvin 实名认证  发表于 2011-5-19 16:55:49 |只看该作者
回复  混混@普宁.中国


     混混你偏心。。。。。。。。。。。。
momo 发表于 2011-5-19 16:53



没偏心。。。

摸摸也来分享些。。。一样有分

使用道具 举报

Rank: 8Rank: 8

6#
那个谁 发表于 2011-5-20 09:24:02 |只看该作者
回复 2# momo


    {:3_42:}  分有啥用。。、

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

7#
Alvin 实名认证  发表于 2011-5-20 09:43:30 |只看该作者
有金钱,你可以买个道具

让摸摸在一定时间内不能回复


使用道具 举报

Rank: 8Rank: 8

8#
momo 发表于 2011-5-20 09:44:44 |只看该作者
回复 6# 那个谁


    只要比杰杰小妹高就行,不管咋说俺是姐姐呢不是?
过了爱做梦的年纪
轰轰烈烈不如平静

使用道具 举报

Rank: 8Rank: 8

9#
那个谁 发表于 2011-5-23 09:36:40 |只看该作者
混混偏心。。、漠漠都高级了。。我还是中级

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

10#
混混@普宁.中国 实名认证  发表于 2011-5-23 09:40:10 |只看该作者
啊。。不对劲,,摸摸怎变成高级了.

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-5-6 13:52 , Processed in 1.083108 second(s), 16 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部