`

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
分享到:
评论

相关推荐

    CoreJava学习笔记

    ### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...

    java笔记 java笔记

    - **简单性**:Java语言设计简洁明了,易于学习和使用。 - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。 #### 1.2 运行原理 Java程序的运行分为几个阶段: 1. **编写**:使用文本编辑器...

    Java入门学习笔记

    ### Java入门学习笔记 #### 一、Java特点与运行原理 **1.1 Java特点** - **简单性:** Java的设计使得它易于学习且避免了许多传统编程语言中存在的复杂性。 - **面向对象:** Java是一种纯面向对象的语言,支持...

    Java个人笔记

    7. **网络编程**:`java.net.*`包中的Socket和ServerSocket类分别用于客户端和服务器端的网络通信,实现了TCP/IP协议。 8. **数据库连接**:`java.sql.*`和`javax.sql.*`提供了与数据库交互的接口和类,如...

    JAVA 笔记 转的笔记

    ### JAVA 笔记知识点概述 #### 一、JAVA特点与运行原理 - **JAVA特点**: - 平台无关性:通过Java虚拟机(JVM)实现跨平台兼容。 - 面向对象:支持封装、继承、多态等特性。 - 安全性:提供内存管理机制避免...

    传智播客Java SE基础毕向东老师全程笔记

    ### 传智播客Java SE基础毕向东老师全程笔记知识点概览 #### 第一章:编程基础 **Java的特性和优势:** - **简单性:** Java的设计初衷是为了简化编程,减少编码负担。 - **面向对象:** Java是完全面向对象的语言...

    j2se一句话学习笔记

    21. **网络编程**:Java SE可以进行网络编程,如通过Socket实现客户端和服务器的通信。 22. **Socket**:Socket是TCP/IP协议的一部分,用于两台机器间建立连接并交换数据。 23. **pack()方法**:在Swing中,`...

    大学计算机基础期末考试.doc

    30. **TCP/IP协议**:TCP/IP是互联网的基础协议,提供端到端的数据通信。 31. **FTP**:FTP(File Transfer Protocol)用于在网络上传输文件。 32. **DNS**:DNS(Domain Name System)将域名转换为IP地址,方便...

    专升本计算机基础笔记(珍藏版).pdf

    5. ASCII码:包含128个符号,34个控制符和94个其他字符,大写字母的ASCII值比小写字母小32。 6. 汉字外码(输入码):分为音码、形码、音形异码和序号码,如拼音输入法、五笔字型等。 7. 指令系统:指令由操作码和...

    专升本计算机基础笔记(珍藏版).doc

    大写字母的ASCII值比小写字母小32。 6. 汉字输入码:主要有音码、形码、音形异码和序号码等不同的输入方式。 7. 指令系统:指令由操作码和操作数组成,计算机执行指令的基本步骤包括取指令、分析指令、执行指令。 ...

    电脑的基本操作知识

    例如,Back Space键用于删除前一个字符,Enter键换行,Shift键切换大小写,Ctrl和Alt键通常与其他键组合使用,Caps Lock锁定大写,Tab键跳格,空格键输入空格。功能键区的F1到F12的功能随应用场景变化。 5. 设备...

Global site tag (gtag.js) - Google Analytics