java学习笔记:TCP通信应用,字符大写转换服务器
先启动服务端
再启动客户端,并输入字符 Student
?
?
?
?
/*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); }}
?