------- android培训、java培训、期待与您交流! ----------
TCP传输是客户端和服务端的传输,客户端是基于Socket类来创建的,而服务端是基于ServerSocket类来创建的;创建客户端的时候首先定义Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。发现该对对象在建立的时候就可以去连接指定主机,因为TCP是面向连接的,所以在建立Socket服务时就要有服务端的存在,并连接成功,形成通路后在该通道进行数据的传输。下面写一个TCP的简单例子:
package com.four; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpDemo { public static void main(String[] args) throws Exception { //创建客户端Socket服务,指定目的主机和端口 Socket s = new Socket("127.0.0.1",10001); //为了发送数据,应该获取Socket流中的输出流 OutputStream os = s.getOutputStream(); //写入数据 os.write("ge men lai le ".getBytes()); s.close(); } } /* * 服务端 * 1,建立服务端的socket服务,ServerSocket(); * 2,获取连接过来的客户端对象,通过ServerSocket的accept方法。 * 没有连接就会等,所以这个方法是阻塞式的。 * 3,客户端如果发送过来数据,那么服务端要使用对应的客户端对象, * 并获取该客户端对象的读取流来读取发送过来的数据 * 4,关闭客户端(可选) */ class TcpServerSocket { public static void main(String[] args) throws Exception { //建立ServerSocket服务,并添加端口号 ServerSocket ss = new ServerSocket(10001); //侦听并接受连接 Socket s = ss.accept(); //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据 InputStream is= s.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); //打印客户端发送过来的数据 System.out.println(new String(buf,0,len)); s.close(); ss.close(); } }
package com.four; import java.io.*; import java.net.*; public class TCPTransTextDemo { //客户端 public static void main(String[] args) throws Exception { Socket s = new Socket("127.0.0.1",10004); //从键盘读取数据放入缓冲中 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in)); //读进来的数据发送到服务端 // BufferedWriter bfwOut = // new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //之所以用PrintWriter是因为它可以接受字符流又可以接受字节流,他还能自动刷新 PrintWriter pw = new PrintWriter(s.getOutputStream(),true); //从服务端读取的数据 BufferedReader bfrIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; //这是从键盘读到的数据写入输出流中,循环读取,直到出现over为止 while((line = bfr.readLine())!=null) { pw.println(line); // bfwOut.write(line); // bfwOut.newLine(); // bfwOut.flush(); if("over".equals(line)) break; String lineIn = bfrIn.readLine(); System.out.println(lineIn); } s.close(); } } class ServerSocketDemo { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10004); Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); // BufferedWriter bw = // new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //之所以用PrintWriter是因为它可以接受字符流又可以接受字节流,他还能自动刷新 PrintWriter pw = new PrintWriter(s.getOutputStream(),true); String line = null; while((line=br.readLine())!=null) { pw.println(line); pw.write(line.toUpperCase()); // bw.write(line.toUpperCase()); // bw.newLine(); // bw.flush(); } s.close(); ss.close(); } } /* * 该例子需要注意的是,都用了阻塞式方法,在把流写入缓冲的时候要记得刷新, * 这样流才会发出去,还有一个记得的是要只有当一方接受到换行符时,他才会返回数据 */
通过以上两个例子可以看出,其实TCP网络编程是建立在IO的基础上的,只要把IO的基础掌握好了,写UDP和TCP网络编程基本就没什么大的问题了,还有就是关于TCP的几个注意事项:在把数据写入到缓冲中的时候要注意刷新,否则服务端是接收不到数据的,还有一个就是在客户端写入数据到输出流中的时候,记得要在文件的末尾添加Socket的shutdownOutput() 方法,来关闭套接字的输出流。