现在的位置: 首页 > 综合 > 正文

黑马程序员的第七天

2013年01月15日 ⁄ 综合 ⁄ 共 2832字 ⁄ 字号 评论关闭

 ------- 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() 方法,来关闭套接字的输出流。

抱歉!评论已关闭.