------- 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(); } }