JAVA Socket基础(简单实现)
Posted 前进路上
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA Socket基础(简单实现)相关的知识,希望对你有一定的参考价值。
学习Socket需要了解的几个概念:
Socket 指的是互联网连接中的各个终结点。互联网连接是怎么创建的,通过IP地址加端口号,进行互通。
A电脑(192.168.3.125:80)》》》》B电脑(192.168.3.111:80) 那么这一个个的Ip地址+端口号就是一个Socket(套接字。)
Http协议:两台互联网的通讯需要遵守统一的应用层协议,通常指Http协议。应用层协议还有FTP协议,SMPT简单邮件协议等。
底层协议:IP/TCP协议。除了http需要遵守,还需要遵守IP/TCP协议。
URL: 应用层协议+IP地址+端口号+资源路径 例如 http://www.baidu.com/index.html; (http协议默认遵守的端口号为80) 文件传输默认为21 远程登录Telnet 23
Java中提供的支持Socket操作的几个常用类:
InetAddress :就是表示IP地址啦,没有构造函数。可以用过静态方法InetAddress.getLocalhost()等方法来或者本机的InetAddress对象。toString方法就是打印IP地址。其他方法请参见api文档。
URL: 资源对象。 就是上面所说的URL对象。
Socket:send方法,getOutPutStream() getInputStream()等
DatagramSocket:数据包,UDP传输保存数据的类。
IP/TCP传输:有序,规则,稳定安全。但速度较慢。
服务端:
package tcp_ip; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * tcp/ip传输 服务器端 * @author Administrator * */ public class Server { public static void main(String[] args) throws IOException { //创建服务器端socket ServerSocket serverSocket = new ServerSocket(9999); //创建指定端口的serverSocket后 设置监听状态! 会阻塞 System.out.println("socket服务端启动成功!正在监听9999端口......"); Socket socket = serverSocket.accept(); //成功接收到请求后会返回一个socket InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader reader = new BufferedReader(isr); String data = reader.readLine(); while(data!=null&&!data.equals("")){ System.out.println(data); data=reader.readLine(); } reader.close(); isr.close(); is.close(); socket.close(); } }
客户端:
package tcp_ip; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { //创建client客户端指定目标ip及端口 (即目标socket) Socket socket = new Socket("localhost", 9999); //或者这个socket的输出流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream); writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端!"); writer.close(); outputStream.close(); socket.close(); } }
//多线程版本:
服务端:
package tcp_ip; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerThread { public static void main(String[] args) throws IOException { //创建服务器端socket ServerSocket serverSocket = new ServerSocket(9999); //创建指定端口的serverSocket后 设置监听状态! 会阻塞 System.out.println("socket服务端启动成功!正在监听9999端口......"); while(true){ Socket socket = serverSocket.accept(); new RunThread(socket).start(); } } }
客户端:
package tcp_ip; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { //创建client客户端指定目标ip及端口 (即目标socket) Socket socket = new Socket("localhost", 9999); //或者这个socket的输出流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream); writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端! 又给你发啦~~"); writer.close(); outputStream.close(); socket.close(); } }
UDP传输:无序,不规则,不安全,速度快。
服务端:
package udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /** * udp客户端 * @author Czt * */ public class Client { public static void main(String[] args) { try { String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8"); DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788); DatagramSocket socket = new DatagramSocket(); socket.send(datagramPacket); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端:
package udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /** * udp客户端 * @author Czt * */ public class Client { public static void main(String[] args) { try { String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8"); DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788); DatagramSocket socket = new DatagramSocket(); socket.send(datagramPacket); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
以上是关于JAVA Socket基础(简单实现)的主要内容,如果未能解决你的问题,请参考以下文章