`

java学习笔记:TCP通信应用,字符大写转换服务器

    博客分类:
  • java
TCP 
阅读更多

先启动服务端

再启动客户端,并输入字符 Student


 



 
 

 

/*
TCP通讯   客户端
需求:建立一个文本转换服务器

客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端
而且客户端可以不断地进行文本转换,当客户端输入over时,转换结束

分析:
客户端,既然是操作设备上数据,那么就可以使用io技术,并按照io操作规律思考问题
源:键盘录入
目的:网络输出流,而且操作的是文本数据,用字符流Reader

代码中有几个注意点:
1.在while循环中,readLine方法读取的是一行,因为它是将字符读到缓冲区的,到结尾换行符时才返回
  所以在读取从服务端返回的socket流时,要有换行符才行
2.在客户端从控制台获取的字符用socket输出流写入缓冲区后要刷新缓冲区,不然可能不会发出去
  关缓冲流时bufr是与控制台关联的,而bufwOut是与socket关联的,关了socket后bufwOut也关闭的

[示例]:字符大写转换客户端
*/

import java.net.*;
import java.io.*;
class Demo
{
  public static void main(String[] args) throws Exception
  {
    new TransClient();
  }

}

/*
客户端步骤
1.建立服务
2.获取键盘录入
3.将数据发给服务端
4.获取服务端返回的大写数据
5.结束,关资源
由于都是文本数据,可以用字符流,InputStreamReader,再用缓冲
*/
class TransClient  //客户端
{
  TransClient() throws Exception
  {
    s.op("客户端启动....");
    client();
  }
  
  public void client()throws Exception
  {
    Socket sock = new Socket("192.168.1.3",10093);
    
    //读取键盘
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    
    //socket输出流,可以将数据发给服务端
    BufferedWriter bufwOut = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    
    //定义一个socket读取流,用来读取服务端返回的大写字符数据
    BufferedReader bufrIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    
    String lineCmd= null; //读取控制台字符
    String lineServer = null; //读取服务端返回的字符
    while(true)
    {
      lineCmd = bufr.readLine();
      if(lineCmd!=null)
      {
        if(lineCmd.equals("over886"))
        {      
          break;
        }
        else
        { //将从控制台读取的数据写入socket输出流     
          bufwOut.write(lineCmd+System.getProperty("line.separator")); //注意一定要换行符
          bufwOut.flush();  //注意,必须的
          lineServer = bufrIn.readLine();
          s.op("从server返回的大写数据:"+lineServer);
        }
      }
    } 
    bufr.close();//关闭键盘录入
    sock.close();
  }
}

class s  
{
  public static void op(Object obj) //打印
  {
    System.out.println(obj);
  }
}

 

 

 

/*
TCP通讯  服务端
将客户端发来的字符转换成大写返回

注意:该例子中出现的问题
1.客户端和服务端都出现莫名的等待,字符也无法输入,
   因为ip错误,找不到主机
   又因为客户端和服务端都有阻塞式方法,这些方法方法没有读取到换行标记,那么就一直等待
2.数据没有发送出去,数据写入到缓冲区中没有flush刷出去

关于代码的改进:
1.BufferedWriter包装的     socket输出流,sock.getOutputStream()
  我们可以用PrintWriter类,它可以接受字符流,也可以接受字节流
  并且它的println方法,是带换行符的,并且自动刷新缓冲
  那么newLine()和flush()方法可以省略了,很方便


[示例]:字符大写转换服务端
*/
import java.net.*;
import java.io.*;
class Demo
{
  public static void main(String[] args) throws Exception
  {
    new TransServer();
  }

}


/*
服务端
源:socket读取流
目的:socket输出流
都是文本字符
*/
class TransServer  //服务端
{
  TransServer() throws Exception
  { 
    s.op("服务端启动......");
    server();
  }

  public void server() throws Exception
  {
    ServerSocket serversock = new ServerSocket(10093);
    Socket sock = serversock.accept(); //在服务端获取客户端套接字对象
    
    String ip= sock.getInetAddress().getHostAddress();
    s.op("来自客户端的IP:"+ip);
    
    //读取socket读取流中的数据
    BufferedReader bufrIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    
    //目的,socket输出流,将大写数据写入到socket输出流,并发给客户端
    BufferedWriter bufwOut = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    String lineIn =null;
    while(true)
    {
      lineIn = bufrIn.readLine();
      if(lineIn!=null)
      { s.op("来自客户端的转换请求:"+lineIn);
        bufwOut.write(lineIn.toUpperCase());
        bufwOut.newLine(); //System.getProperty("line.separator")
        bufwOut.flush(); //注意必须的
      }
      else
      {
        break;
      }
    }
    sock.close();
    serversock.close();
  }
}

class s
{
  public static void op(Object obj) //打印
  {
    System.out.println(obj);
  }
}

 

  • 大小: 36.7 KB
  • 大小: 32.1 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics