java学习(21)

from: http://android.yaohuiji.com/archives/3668

 

第二十一讲:网络编程(一)

05 JAN

lesson21

本讲内容: socket 只会装傻的”智能“机器人

套接字(socket)是代表计算机之间网络连接的对象。要进行计算机间的网络通讯,建立TCP连接,那么就需要Socket编程,Java提供了ServerSocket类和Socket类,可以利用他们很方便的实现,计算机间的网络通讯。

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

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

直接上代码,服务器端 TalkServer.java :

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class TalkServer {

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

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

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

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

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

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

        //定义一些变量
        String input;      

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


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


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

        //关闭释放资源
        socketInput.close();
        socketOutput.close();
        socket.close();
    }


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

        String output=replys[number%7];

        if(number%7==5){
            output = output+" "+input;
        }

        number++;
        return output;
    }

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

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


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

 

客户端代码 TalkClient.java :

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TalkClient {

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

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

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

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

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

        // 定义一些变量
        String input;      

        // 一直执行
        while(true){
            //从键盘获取数据,通过socket对象发送出去
            input = keyboardInput.readLine();
            socketOutput.println(input);

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

 

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

image

 

好了,本将就到这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值