黑马程序员------Socket编程之TCP

 ------- android培训、java培训、期待与您交流! ----------


java tcp 编程

小知识点:

1.ServerSocket(int port,int backlog)

ServerSocket中 port 表示端口号 , backlog 表示最大链接数

比如 这个服务器只能同时链接10000台。

2.Socket 有一个空的构造方法 是 Socket() 但是这个不知道目的IP地址和端口号

这个时候就要用 connect(SocketAddress endopint)方法来链接

SocketAddress 是将IP地址和端口号封装到一起

和平时建立的时候不一样

平时建立Socket端口 是分开写的

比如Socket s = new Socket("127.0.0.1",10007);

域名解析:

域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。

两种方式:第一种:先把域名发送到专门用于解析域名的服务器,服务器把IP返回到电脑

第二种:在本地有一个HOST配置文件,首先在本地找和域名对应的IP,如果没有则发送到服务器寻找



第一个例子:


第一个例子:演示TCP传输:


这是发送端(客户端)

/*
Sock编程之Tcp
强调端点, 客户端和服务端 

主要用到类:
Socket      ServerSocket

演示TCP传输:
1,tcp分客户端和服务端。
2,客户端对应的对象时Socket
	服务端对应的对象时ServerSocket

	客户端, 
	通过查询socket对象,发现在该对象建立时,就可以去连接指定主机。
	因为tcp是面向连接的。所以在建立socket服务时,
	就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。
	
	需求:给服务端发送一个文本数据
	步骤,
	1,创建Socket 服务,并指定要连接的主机和端口。
*/
import java.net.*;
import java.io.*;
class TcpClient
{
	public static void main(String[] args)throws Exception
	{
		//创建客户端的Socket服务,指定目的主机
		Socket s = new Socket("127.0.0.1",10002);
		
		//为了发送数据,应该获取socket流中的输出流
		OutputStream out = s.getOutputStream();
		//写入数据
		out.write("TCP test".getBytes());
		
		//关闭客户端
		s.close();

	
	}
}



这是接收端(服务器端)

/*
需求 : 定义端点接收数据并打印在控制台上
服务端:
1,建立服务端的socket服务,通过ServerSocket();
并监听一个端口
2,获取链接过来的客户端对象。
通过ServerSocket的accept方法,没有链接,
所以这个方法是阻塞式的
3,客户端如果发过来是、的数据, 

*/
import java.io.*;
import java.net.*;
class TcpServer 
{
	public static void main(String[] args)throws Exception
	{
		//建立服务socke服务,并监听一个端口。
		ServerSocket ss = new ServerSocket(10002);
		
		//通过accept方法获取链接过来的客户对象
		Socket s = ss.accept();
		//获取IP地址
		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的传输的客户端和服务端的互访。


/**
 * 演示TCP的传输的客户端和服务端的互访。
 * 需求:客户端发送数据给服务端,服务端接收到数据后,给客户端返回信息;
 * 
 * 
 * 
 * 客户端:
 * 1,建立socket服务,并指定连接主机和端口
 * 2,获取socket流中的输出流,将数据写入流中,通过网络发送给服务端。
 * 3,获取socket流中的输入流,获取服务端返回的数据,并打印。
 * 4,关闭客户端.
 */
import java.io.*;
import java.net.*;
public class TCPClient1
{
    public static void main(String[] args) throws  IOException
    {
	//第一步连接主机 创建端口 
	Socket sk = new Socket("127.0.0.1",10003);
	
	//第二步 获取输出流  发送数据
	OutputStream out = sk.getOutputStream();
	
	out.write("服务端,你好".getBytes());
	
	//第三步 获取输入流,打印获取数据
	InputStream in = sk.getInputStream();
	
	int len = 0;
	byte[] buf = new byte[1024];
	
	len = in.read(buf);
	
	System.out.println(new String(buf,0,len));
	
	
	//第四步 关闭端口
	sk.close();
    }

}

下面是服务端:
import java.io.*;
import java.net.*;
public class TCPServer1
{
    public static void main(String[] args)throws Exception
    {
	//创建服务端接口
	ServerSocket ss = new ServerSocket(10003);
	
	//接收数据
	Socket s = ss.accept();
	
	//读取数据  
	InputStream in = s.getInputStream();
	
	byte[] buf = new byte[1024];
	
	int len = 0;
	len = in.read(buf);
	//打印客户端IP
	String ip = ss.getInetAddress().getHostAddress();
	System.out.println("ip:"+ip);
	
	//打印数据
	System.out.println("收到的信息为:"+new String(buf,0,len));
	
	//向客户端发送信息
	OutputStream out = s.getOutputStream();
	
	out.write("服务端已收到信息".getBytes());
	
	//关闭
	s.close();
	ss.close();
	
	
    }

}



***************************************************邪恶的分割线**********************************************************************************************************************



下面是第三个例子:建立通过服务器进行文本转换



import java.io.*;
import java.net.*;
/**
 * 需求:建立一个文本转换服务器
 * 客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端。、
 * 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束.
 * 
 * 分析:
 * 客户端:
 * 计算式操作设备上的数据。那么就可以使用io技术,并按照io的操作规律来思考。
 * 源:键盘录入
 * 目的:网络设备,网络输出流.
 * 而且操作的是文本数据,可以选择字符流.
 * 
 * 步骤。
 * 1,建立服务,
 * 2,获取键盘录入。
 * 3,将数据发给服务端。
 * 4,获取服务端返回的大写数据。
 * 5,结束,关闭资源。
 * 
 * 因为都是文本数据,可以使用字符流进行操作,同时提高效率用缓冲流
 * 需要使用转换流
 * @author 六道 qq 951442843
 *
 */
public class TransClient
{
    public static void main(String[] args)throws Exception
    {
	
	Socket s = new Socket("127.0.0.1",10005);
	
	//定义读取键盘数据的流对象
	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));
	//定义目的,将数据写入socket输出流,发给服务端、
	BufferedWriter bufw = 
		new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
	
	
	//定义一个socket读取流,读取服务端返回的大写信息.
	BufferedReader bufin = 
		new BufferedReader(new InputStreamReader(s.getInputStream()));
	
	
	String line = null;
	
	//写入数据的同时接受服务端返回的数据
	while((line = bufr.readLine()) != null)
	{
	    if("over".equals(line))
	    {
		break;
	    }
	    //写入数据
	    bufw.write(line);
	    //需要加入换行符 因为readLine方法读取时需要有回车符做结束
	    bufw.newLine();
	    //因为在内存中需要刷新
	    bufw.flush();
	    //接受服务端返回的数据
	    String str = bufin.readLine();
	    System.out.println("server:" + str);
	}
	
	//关闭端口
	s.close();
	
    }

}
/**
 * 注意:出现客户端和服务端莫名等待。
 * 
 * 因为客户端和服务端都有阻塞时方法,这些方法没有读到结束标记,那么就
 * 一直等待,而导致两端都在等待。
 * 
 * 
 */


下面是服务端:
import java.io.*;
import java.net.*;
/**
 * 服务端;
 * 源:socket读取流
 * 目的:socket输出流
 * 都是文本,可以装饰。
 * @author Administrator
 *
 */
public 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" + ip);
	
	//读取socket读取流中的数据
	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(s.getInputStream()));
	
	//目的,socket输出流,将大写数据写入到socket输出流,并发送给客户端
	BufferedWriter bufw = 
		new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
	
	String line = null;
	while((line = bufr.readLine()) != null)
	{
	    System.out.println(line);
	    //转换成大写后发给服务端数据
	    bufw.write(line.toUpperCase());
	    
	    //需要加入换行符 因为readLine方法读取时需要有回车符做结束
	    bufw.newLine();
	    //因为在内存中需要刷新
	    bufw.flush();
	}
	
	s.close();
	ss.close();
    }

}



下面这个例子是上面例子的优化

小小的改变

import java.io.*;
import java.net.*;
/**
 * @author 六道 
 *
 */
public class TransClient
{
    public static void main(String[] args)throws Exception
    {
	
	Socket s = new Socket("127.0.0.1",10005);
	
	//定义读取键盘数据的流对象
	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));

	//这里可以替换
	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);
	    String str = bufin.readLine();
	    System.out.println("server:" + str);
	}
	
	s.close();
	
    }

}


import java.io.*;
import java.net.*;
/**
 * 服务端;
 * 源:socket读取流
 * 目的:socket输出流
 * 都是文本,装饰。
 * @author Administrator
 *
 */
public 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" + ip);
	
	//读取socket读取流中的数据
	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(s.getInputStream()));
	
		//这里可以简化用PrintWrite
	PrintWriter out = new PrintWriter(s.getOutputStream(),true);

	String line = null;
	while((line = bufr.readLine()) != null)
	{
		System.out.println(line);
	    
		out.println(line.toUpperCase());
	}
	
	s.close();
	ss.close();
    }

}





你可能感兴趣的:(黑马程序员------Socket编程之TCP)