import java.io.*; import java.net.*; public class TcpClient { public static void main(String args[]) throws Exception { Socket s = new Socket("172.16.215.105",2221);//定义客户端sorket //向服务端发送数据 BufferedWriter bufwriter = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line = null; BufferedReader bufReader = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//从键盘读取数据 while((line = reader.readLine())!=null) { if(line.equals("over")) break; bufwriter.write(line);//向服务端发送数据 bufwriter.newLine(); bufwriter.flush(); //下面开妈读取服务端发来的数据 String reString = bufReader.readLine(); System.out.println(reString); } } } /* * 些例子的需求是将一行字符发送到服务端,然后由服务端将其转换成大写的再返回过来 * 在这个例子操作中往往会引起无等待,因此我们要从下面几个原因分析 * 1.因为些过程操作的是字符,所以我们在字符的传输过程自然要用到 字符流,为了提交效率,我们再加入缓冲 * 这个过程中往往会出错误:字符流的 write 一般都是写入到了缓冲区内,如果我们忘了 flush ,则将会引起 * 无故的等待,因此在操作字符流的时候,一定不要忘了 flush ,无论是客户端的write 还是服务端的write * 2. 我们在从键盘读取数据的时候是以一行为标准来读取的,readerLine() 是读取换行符以前的内容,所以 * 我们在对数据发送时,我们只是发送了换行符以前的内容,下面看我们的服务端的读取,它是以readLine() * 读取的,而我们在发送的时候,并没有将换行发送来过,所以在读取的时候,会造成等待 * 解决的办法就是在发达数据的时候,我们要把换行符也一直发送过来,利用 bufferedReader 中的 newLine * * 或者我们还可以用更为省力的 PrintStream 来操作,它有自动刷新和换行的功能,正好解决了上面的问题 * * 总之上面的问题在两个方面: * 1.字符流发送之前要刷新 * 2.以换行读取内容时,在发送前不要忘了把换行也发送出去 * * * * * */
import java.io.*; import java.net.*; public class TcpServer { public static void main(String args[]) throws Exception { ServerSocket server = new ServerSocket(2221); Socket s = server.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+" is connecting...."); BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line = null; while((line = reader.readLine())!=null) { line = line.toUpperCase(); writer.write(line); writer.newLine(); writer.flush(); } } }
Java Tcp 字符发送
最新推荐文章于 2024-04-22 19:08:57 发布