`
jiao13953900900
  • 浏览: 32228 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

网络编程TCP传输

    博客分类:
  • java
阅读更多

 

 

 

TCP传输

 

 

TCP传输

Socket和ServerSocket

建立客户端和服务器端

建立连接后,通过Socket中的IO流进行数据的传输

关闭socket

同样,客户端与服务器端是两个独立的应用程序。

 

 

基本思路(客户端)

客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。

连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。

与服务端通讯结束后,关闭Socket。

基本思路(服务端)

服务端需要明确它要处理的数据是从哪个端口进入的。

当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。

当该客户端访问结束,关闭该客户端。

 

演示tcp传输。

 

1,tcp分客户端和服务端。

2,客户端对应的对象是Socket。

服务端对应的对象是ServerSocket。

 

客户端,

通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。

因为tcp是面向连接的。所以在建立socket服务时,

就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。

 

 

需求:给服务端发送给一个文本数据。

 

步骤:

1,创建Socket服务。并指定要连接的主机和端口。

 

import java.io.*;
import java.net.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception 
	{
		//创建客户端的socket服务。指定目的主机和端口
		Socket s = new Socket("192.168.1.254",10003);
		
		//为了发送数据,应该获取socket流中的输出流。
		OutputStream out = s.getOutputStream();

		out.write("tcp ge men lai le ".getBytes());


		s.close();
	}
}

 

 

需求:定义端点接收数据并打印在控制台上。

 

服务端:

1,建立服务端的socket服务。ServerSocket();

并监听一个端口。

2,获取连接过来的客户端对象。

通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。

3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。

并打印在控制台。

 

4,关闭服务端。(可选)

 

class  TcpServer
{
	public static void main(String[] args) throws Exception
	{
		//建立服务端socket服务。并监听一个端口。
		ServerSocket ss = new ServerSocket(10003);

		//通过accept方法获取连接过来的客户端对象。
		while(true)
		{
		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+".....connected");

		//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
		InputStream in = s.getInputStream();
		
		byte[] buf = new byte[1024];
		int len = in.read(buf);

		System.out.println(new String(buf,0,len));

		s.close();//关闭客户端.
		}
		//ss.close();
	}
}

 

 

演示tcp的传输的客户端和服务端的互访。

 

需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

 

 

客户端:

1,建立socket服务。指定要连接主机和端口。

2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。

3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。

4,关闭客户端资源。

 

import java.io.*;
import java.net.*;

class TcpClient2 
{
	public static void main(String[] args)throws Exception 
	{
		//建立服务,指定主机端口
		Socket s = new Socket("192.168.1.254",10004);
		//得到输出流对象
		OutputStream out = s.getOutputStream();
		//将数据写入
		out.write("服务端,你好".getBytes());

		//得到输入流的对象
		InputStream in = s.getInputStream();

		byte[] buf = new byte[1024];
		//读取数据
		int len = in.read(buf);

		System.out.println(new String(buf,0,len));

		s.close();
	}
}


class TcpServer2
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10004);

		Socket s = ss.accept();
		//得到地址
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");
		//得到输入流对象
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		//读取数据
		int len = in.read(buf);

		System.out.println(new String(buf,0,len));

		//得到服务端输出流
		OutputStream out = s.getOutputStream();
		Thread.sleep(10000);
		//写入数据
		out.write("哥们收到,你也好".getBytes());
		s.close();
		ss.close();
	}
}

 

 

需求:建立一个文本转换服务器。

客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。

而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。

 

分析:

客户端:

既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。

源:键盘录入。

目的:网络设备,网络输出流。

而且操作的是文本数据。可以选择字符流。

 

步骤

1,建立服务。

2,获取键盘录入。

3,将数据发给服务端。

4,后去服务端返回的大写数据。

5,结束,关资源。

 

都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。

 

import java.io.*;
import java.net.*;

class  TransClient
{
	public static void main(String[] args) throws Exception
	{
		//建立服务
		Socket s = new Socket("192.168.1.254",10005);
		//定义读取键盘数据的流对象。
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));

		//定义目的,将数据写入到socket输出流。发给服务端。
		//BufferedWriter bufOut = 
			//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);



		//定义一个socket读取流,读取服务端返回的大写信息。
		BufferedReader bufIn = 
			new BufferedReader(new InputStreamReader(s.getInputStream()));

		String line = null;
		//读取录入的数据
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			//将数据写入到服务端
			out.println(line);
//			bufOut.write(line);
//			bufOut.newLine();
//			bufOut.flush();
			//读取服务端的返回信息
			String str =bufIn.readLine();
			System.out.println("server:"+str);
			
		}

		bufr.close();
		s.close();


	}
}

 

 

服务端:

源:socket读取流。

目的:socket输出流。

都是文本,装饰。

 

class  TransServer
{
	public static void main(String[] args) throws Exception
	{
		//建立服务,监听端口
		ServerSocket ss = new ServerSocket(10005);

		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");

		//读取socket读取流中的数据。
		BufferedReader bufIn =
			new BufferedReader(new InputStreamReader(s.getInputStream()));

		//目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
		//BufferedWriter bufOut = 
			//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		String line = null;
		while((line=bufIn.readLine())!=null)
		{
			System.out.println(line);

			out.println(line.toUpperCase());
//			bufOut.write(line.toUpperCase());
//			bufOut.newLine();
//			bufOut.flush();
		}

		s.close();
		ss.close();

	}
}

 

该例子出现的问题。

现象:客户端和服务端都在莫名的等待。

为什么呢?

因为客户端和服务端都有阻塞式方法。这些方法么没有读到结束标记。那么就一直等

而导致两端,都在等待。

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics