网络编程-Tcp传输2

输入一个东东、返回这个东东的大写并输出。 

import java.io.*;
import java.net.*;
public class SocketLearning  {

    public static void main(String[] args) throws Exception   {
        
        new Thread(new TransClient()).start();
        new Thread(new TransServer()).start();
        
//        System.out.println(InetAddress.getLocalHost().getHostAddress());
        
    }
}


class TransClient implements Runnable
{
    public void run()
    {
        try {
            mymethod();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public void mymethod() throws Exception
    {
        Socket s = new Socket("199.234.8.31",10022);
        
        //定义读取键盘数据的流对象。
        BufferedReader bufr =
                new BufferedReader(new InputStreamReader(System.in));
        
        //定义目的,将数据写入到socket输出流 、发给服务端。
        BufferedWriter bufOut =
                new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        
//        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        
        //定义一个socket读取流、读取服务端返回的大写信息。
        BufferedReader bufIn = 
                new BufferedReader(new InputStreamReader(s.getInputStream()));
        
        String line = null;
        
        while((line=bufr.readLine())!=null)
        {
            if("over".contentEquals(line))
                break;

//            out.println(line);   //在这里用了 printWriter 代替了 bufferedWriter、  这一句话 代替了下面的三句话。
            bufOut.write(line);
            bufOut.newLine();
            bufOut.flush();

            String str = bufIn.readLine();
            System.out.println("Server::"+str);
        }
        bufr.close();
        s.close();
    }
}
/*
 * 服务端:  源:socket读取流、 目的:socket输出流。  都是文本、装饰一下
 */
class TransServer implements Runnable
{
    public void run()
    {
        try {
            mymethod();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public void mymethod() throws Exception
    {
        ServerSocket ss = new ServerSocket(10022);
        
        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"....connected");
        
        // 源:读取socket中的数据
        BufferedReader bufIn = 
                new BufferedReader(new InputStreamReader(s.getInputStream()));
        //目的:socket 输出流、将大写数据写入到socket输出流、并发送给客户端。
        
        BufferedWriter bufOut = 
                new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        
        String line = null;
        while((line=bufIn.readLine())!=null)
        {
            bufOut.write(line.toUpperCase());
            bufOut.newLine();
            bufOut.flush();
        }
        s.close();
        ss.close();
        
        
        
    }
}
/*
该例子出现的问题 : 
现象:   客户端和服务端都在莫名的等待 。
为什么呢?
因为客户端和服务端都有阻塞式方法。这些方法没有读到结束标记,就会一直等,而导致两段都在等待。而导致两段都在等待
*/

 

posted @ 2019-11-20 14:32  蚂蚁雅黑1010  阅读(113)  评论(0编辑  收藏  举报