Java Socket的基础知识

一、网络基础知识(参考计算机网络)
           关于计算机网络部分可以参考相关博客:
          《TCP/IP协议栈及OSI参考模型详解》
       1、两台计算机间进行通讯需要以下三个条件:
            IP地址(第4点)、协议、端口号(第5点)
       2、TCP/IP协议:
            是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈
            TCP:Transmission Control Protocol 传输控制协议
            IP:Internet Protocol 互联网协议
       3、TCP/IP五层模型

        物理层以太网 · 调制解调器 · 电力线通信(PLC) · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线等
       数据链路层Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网 ·FDDI · 帧中继 · GPRS · EVDO ·HSPA · HDLC · PPP · L2TP ·PPTP · ISDN·STP 等
       网络层协议IP (IPv4 · IPv6) · ICMP· ICMPv6·IGMP ·IS-IS · IPsec · ARP · RARP等
       传输层协议TCP · UDP · TLS · DCCP · SCTP · RSVP · OSPF 等
       应用层协议WebSocket·DHCP ·DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP ·SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP · RIP 等
       4、IP地址

            为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识---IP地址。
            32位二进制
       5、端口
            区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。
            如:HTTP:80  FTP:21 Telnet:23
            IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
       6、Socket套接字:
           网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。
          Socket原理机制:
           通信的两端都有Socket
           网络通信其实就是Socket间的通信
           数据在两个Socket间通过IO传输       
       7、Java中的网络支持
             针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:
             InetAddress:用于标识网络上的硬件资源,主要是IP地址
             URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
             Sockets:使用TCP协议实现的网络通信Socket相关的类
             Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。
二、InetAddress
         InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。 
         该类没有构造方法
//获取本机的InetAddress实例
InetAddress address =InetAddress.getLocalHost();
address.getHostName();//获取计算机名
address.getHostAddress();//获取IP地址
byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分

//获取其他主机的InetAddress实例
InetAddress address2 =InetAddress.getByName("其他主机名");
InetAddress address3 =InetAddress.getByName("IP地址");
三、URL类
     1、URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址,协议名:资源名称       
//创建一个URL的实例
URL baidu =new URL("http://www.baidu.com");
URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点
url.getProtocol();//获取协议
url.getHost();//获取主机
url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
url.getPath();//获取文件路径
url.getFile();//文件名,包括文件路径+参数
url.getRef();//相对路径,就是锚点,即#号后面的内容
url.getQuery();//查询字符串,即参数
    
2、使用URL读取网页内容
     通过URL对象的openStream()方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源(可以用缓冲流和字节流等方式download)
//使用URL读取网页内容
//创建一个URL实例
URL url =new URL("http://www.baidu.com");
InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流
InputStreamReader isr =newInputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码
BufferedReader br =newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率
String data = br.readLine();//读取数据
while(data!=null){
System.out.println(data);//输出数据
data = br.readerLine();
}
br.close();
isr.colose();
is.close();
四、TCP编程
     1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低。

(何为三次握手)
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
     第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
     第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
     经历完这三次握手,客户端和服务器端开始传送数据。

  2、Java中基于TCP协议实现网络通信的类

            客户端的Socket类
            服务器端的ServerSocket类

例子:

        客户端:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
	public static void main(String[] args) {
		//监听指定端口(自定义端口)
		int port = 55533;
		ServerSocket server;
		try {
			//建立ServerSocket 不同与Socket类,它用于监听获取指定端口的内容的东西
			server = new ServerSocket(port);
			System.out.println("server将等待连接的到来");
			//这个方法是让socket处于等待状态
			Socket socket = server.accept();
			//当有 信息输出的时候,则用IO流输出
			InputStream inputStream = socket.getInputStream();
			byte[] bytes = new byte[1024];
			int len;
			StringBuffer sb = new StringBuffer();
			while((len=inputStream.read(bytes))!=-1){
				sb.append(new String(bytes,0,len,"UTF-8"));
			}
			System.out.println("get Message"+sb.toString());
			inputStream.close();
			socket.close();
			server.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

服务器端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketClient {
	public static void main(String[] args) {
		//你的IP地址
		String host="127.0.0.1";
		//你的要的监听的端口号
		int port = 55533;
		try {
			Socket socket = new Socket(host, port);
			OutputStream outputStream = socket.getOutputStream();
			String message = "你好啊成功了";
			outputStream.write(message.getBytes("UTF-8"));
			outputStream.close();
			socket.close();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值