黑马程序员--网络编程


协议:规定了通信双方应该怎样通信。
HTTP-----应用层协议
TCP
IP
UDP
SMTP
POP3
---------------------
TCP
HTTP协议是基于TCP协议上开发。
要求必须有请求,服务器得到请求进行响应,才可以进行通信。
UDP
丢包协议。

UDP

将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快

TCP

建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低

网络开发三要素:(重点)

1.协议
规定双方如果通信
2.IP地址
IP地址是唯一的,它唯一定位主机。
3.端口号
用来定义IP地址指向这台主机的某一个应用程序。

常用端口号:

http协议:  80
SMTP 20 21
POP3 110
tomcat  8080
mysql 3306
oracle 1521
sqlserver 1433

端口号  65536个  0-65535 对于前1024不推荐使用。

BS结构  Broswer server  浏览器服务器
CS结构  Client Server   客户端服务器

基于TCP下网络开发
java.net包下.
InetAddress它代表的就是IP地址.

InetAddress它的获取:

getByName(String hostname); 
参数是主机名   返回的就是一个InetAddress对象.

getLocalHost() 获取本机InetAddress对象.

其它API
getHostName();获取主机名
getHostAddress(); 获取ip地址
- ------------------------------------------------
TCP协议下开发,要求必须请求,响应,在进行通信。

ServerSocket
new ServerSocket(int prot); 在创建服务器时,只需要指定端口就可以。
Socket
就代表一个客户端。

ServerSocket它的accept方法可以接收一个客户端,返回一个Socket对象。它与客户端的Socket是匹配的。通过
Socket就可以实现通信.

Socket提供
getInputStream();

getOutputStream();


InetAddress:构造方法私有,不能直接创建对象。
InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。
InetAddress getLocalHost():返回本地主机。
InetAddress[] getAllByName(String host)
ip.getHostAddress(), 
ip.getHostName()



  1. package demo;  
  2.   
  3.   
  4. import java.net.InetAddress;  
  5.   
  6.   
  7. public class Demo1 {  
  8.     public static void main(String[] args) throws Exception {  
  9.           
  10.         InetAddress i = InetAddress.getLocalHost();  
  11.         System.out.println(i);  
  12.           
  13.         i = InetAddress.getByName("www.XXX.com");  
  14.         System.out.println(i);  
  15.         System.out.println(i.getHostAddress());  
  16.           
  17.         System.out.println(i.getHostName());  
  18.     }  
  19. }  
package demo;


import java.net.InetAddress;


public class Demo1 {
	public static void main(String[] args) throws Exception {
		
		InetAddress i = InetAddress.getLocalHost();
		System.out.println(i);
		
		i = InetAddress.getByName("www.XXX.com");
		System.out.println(i);
		System.out.println(i.getHostAddress());
		
		System.out.println(i.getHostName());
	}
}



输出:  输出 被屏蔽.........



Socket
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。

UDP传输


1:只要是网络传输,必须有socket 。
2:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。


直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。


因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。


DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。


udp的发送端:
1:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2:明确要发送的具体数据。
3:将数据封装成了数据包。
4:用socket服务的send方法将数据包发送出去。
5:关闭资源。


udp的接收端:
1:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
2:定义数据包,用于存储接收到数据。
3:通过socket服务的接收方法将收到的数据存储到数据包中。
4:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5:关闭资源。


发送端(客户端)

  1. import java.net.*;  
  2. class  UdpSend{  
  3.         public static void main(String[] args)throws Exception {  
  4.                 // 1,建立udp的socket服务。  
  5.                 DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。  
  6.                 // 2,明确要发送的具体数据。  
  7.                 String text = "udp传输演示 哥们来了";  
  8.                 byte[] buf = text.getBytes();  
  9.                 // 3,将数据封装成了数据包。  
  10.                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);  
  11.                 // 4,用socket服务的send方法将数据包发送出去。  
  12.                 ds.send(dp);  
  13.                 // 5,关闭资源。  
  14.                 ds.close();  
  15.         }  
  16. }  
import java.net.*;
class  UdpSend{
        public static void main(String[] args)throws Exception {
                // 1,建立udp的socket服务。
                DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。
                // 2,明确要发送的具体数据。
                String text = "udp传输演示 哥们来了";
                byte[] buf = text.getBytes();
                // 3,将数据封装成了数据包。
                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
                // 4,用socket服务的send方法将数据包发送出去。
                ds.send(dp);
                // 5,关闭资源。
                ds.close();
        }
}


  1. //接收端(服务器端)  
  2.   
  3.   
  4. import java.net.*;  
  5. class UdpRece {  
  6.         public static void main(String[] args) throws Exception{  
  7.                 // 1,创建udp的socket服务。  
  8.                 DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样!  
  9.                 // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。  
  10.                 byte[] buf = new byte[1024];  
  11.                 DatagramPacket dp = new DatagramPacket(buf,buf.length);  
  12.                 // 3,通过socket服务的接收方法将收到的数据存储到数据包中。  
  13.                 ds.receive(dp);//该方法是阻塞式方法。  
  14.                 // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。  
  15.                 String ip = dp.getAddress().getHostAddress();  
  16.                 int port = dp.getPort();  
  17.                 String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。  
  18.                 System.out.println(ip+":"+port+"--"+text);  
  19.                 // 5,关闭资源。  
  20.                 ds.close();  
  21.         }  
  22. }  
//接收端(服务器端)


import java.net.*;
class UdpRece {
        public static void main(String[] args) throws Exception{
                // 1,创建udp的socket服务。
                DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样!
                // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                // 3,通过socket服务的接收方法将收到的数据存储到数据包中。
                ds.receive(dp);//该方法是阻塞式方法。
                // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。
                String ip = dp.getAddress().getHostAddress();
                int port = dp.getPort();
                String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。
                System.out.println(ip+":"+port+"--"+text);
                // 5,关闭资源。
                ds.close();
        }
}


TCP传输


两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。

tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket

TCP客户端:
1:建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2:如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。
3:关闭资源。

  1. import java.net.*;  
  2. import java.io.*;  
  3. //需求:客户端给服务器端发送一个数据。  
  4. class  TcpClient{  
  5.         public static void main(String[] args) throws Exception{  
  6.                 Socket s = new Socket("10.1.31.69",10002);  
  7.                 OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。  
  8.                 out.write("tcp演示,哥们又来了!".getBytes());  
  9.                 s.close();  
  10. }  
  11. }  
import java.net.*;
import java.io.*;
//需求:客户端给服务器端发送一个数据。
class  TcpClient{
        public static void main(String[] args) throws Exception{
                Socket s = new Socket("10.1.31.69",10002);
                OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。
                out.write("tcp演示,哥们又来了!".getBytes());
                s.close();
}
}


练习示例:
  1. import java.awt.event.ActionEvent;  
  2. import java.awt.event.ActionListener;  
  3. import java.io.DataInputStream;  
  4. import java.io.DataOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8. import javax.swing.JButton;  
  9. import javax.swing.JFrame;  
  10. import javax.swing.JPanel;  
  11. import javax.swing.JScrollPane;  
  12. import javax.swing.JTextArea;  
  13. import javax.swing.JTextField;  
  14.   
  15.   
  16.   
  17. //客户端  
  18. public class ClientFrameTest extends JFrame implements Runnable,  
  19.         ActionListener {  
  20.     DataInputStream dis = null;  
  21.     DataOutputStream dos = null;  
  22.   
  23.     // 声明出界面上所要使用的组件.  
  24.     JTextArea area = new JTextArea(1630);  
  25.     JScrollPane jsp = new JScrollPane(area);  
  26.   
  27.     JTextField txt = new JTextField(24);  
  28.     JButton btn = new JButton("发送");  
  29.     JPanel panel = new JPanel();  
  30.   
  31.     public ClientFrameTest() {  
  32.         super("客户端");  
  33.         btn.addActionListener(this);  
  34.         txt.addActionListener(this);  
  35.         area.setEditable(false); // 文本域不可编辑  
  36.         area.setLineWrap(true);  
  37.   
  38.         panel.add(jsp);  
  39.         panel.add(txt);  
  40.         panel.add(btn);  
  41.         this.getContentPane().add(panel);  
  42.         this.setBounds(100100400400);  
  43.         this.setDefaultCloseOperation(3);  
  44.         this.setVisible(true);  
  45.         this.initClient();  
  46.         new Thread(this).start();  
  47.     }  
  48.   
  49.     // 初始化客户端  
  50.     public void initClient() {  
  51.         // 创建客户端,并向服务器发送请求  
  52.         Socket client;  
  53.         try {  
  54.             client = new Socket("localhost"9999);  
  55.             // 通过socket获取输入输出流,完成通信  
  56.   
  57.   
  58.             // 客户端读取服务器发送的信息. 输入流  
  59.             dis = new DataInputStream(client.getInputStream());  
  60.             // 客户端向服务器发送信息. 输出流  
  61.             dos = new DataOutputStream(client.getOutputStream());  
  62.   
  63.   
  64.         } catch (UnknownHostException e) {  
  65.             System.out.println("找不到服务器");  
  66.         } catch (IOException e) {  
  67.             System.out.println("链接服务器失败");  
  68.         }  
  69.   
  70.   
  71.     }  
  72.   
  73.   
  74.     // 读操作  
  75.     public void readMsg() throws IOException {  
  76.         String msg = dis.readUTF();  
  77.         area.append("server:" + msg + "\n");  
  78.     }  
  79.   
  80.   
  81.     // 写操作  
  82.     public void writeMsg(String msg) {  
  83.         // System.out.println("请输入要发送到服务器端的信息:");  
  84.         try {  
  85.             dos.writeUTF(msg);  
  86.             dos.flush();  
  87.         } catch (IOException e) {  
  88.             e.printStackTrace();  
  89.         }  
  90.   
  91.   
  92.         area.append("client:" + msg + "\n");  
  93.   
  94.   
  95.     }  
  96.   
  97.   
  98.     // 子线程 不停的读取信息  
  99.     public void run() {  
  100.   
  101.   
  102.         while (true) {  
  103.             try {  
  104.                 this.readMsg();  
  105.             } catch (IOException e) {  
  106.                 e.printStackTrace();  
  107.             }  
  108.         }  
  109.     }  
  110.   
  111.   
  112.     public static void main(String[] args) throws UnknownHostException,  
  113.             IOException {  
  114.   
  115.     <span style="white-space:pre">    </span>ClientFrameTest cd3 = new ClientFrameTest();  
  116.           
  117.     }  
  118.   
  119.   
  120.     public void actionPerformed(ActionEvent e) {  
  121.         // 得到文本框中的信息,调用输出方法,将信息输出  
  122.         String msg = txt.getText();  
  123.   
  124.         this.writeMsg(msg);  
  125.   
  126.   
  127.         txt.setText("");  
  128.   
  129.   
  130.     }  
  131. }  
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;



//客户端
public class ClientFrameTest extends JFrame implements Runnable,
		ActionListener {
	DataInputStream dis = null;
	DataOutputStream dos = null;

	// 声明出界面上所要使用的组件.
	JTextArea area = new JTextArea(16, 30);
	JScrollPane jsp = new JScrollPane(area);

	JTextField txt = new JTextField(24);
	JButton btn = new JButton("发送");
	JPanel panel = new JPanel();

	public ClientFrameTest() {
		super("客户端");
		btn.addActionListener(this);
		txt.addActionListener(this);
		area.setEditable(false); // 文本域不可编辑
		area.setLineWrap(true);

		panel.add(jsp);
		panel.add(txt);
		panel.add(btn);
		this.getContentPane().add(panel);
		this.setBounds(100, 100, 400, 400);
		this.setDefaultCloseOperation(3);
		this.setVisible(true);
		this.initClient();
		new Thread(this).start();
	}

	// 初始化客户端
	public void initClient() {
		// 创建客户端,并向服务器发送请求
		Socket client;
		try {
			client = new Socket("localhost", 9999);
			// 通过socket获取输入输出流,完成通信


			// 客户端读取服务器发送的信息. 输入流
			dis = new DataInputStream(client.getInputStream());
			// 客户端向服务器发送信息. 输出流
			dos = new DataOutputStream(client.getOutputStream());


		} catch (UnknownHostException e) {
			System.out.println("找不到服务器");
		} catch (IOException e) {
			System.out.println("链接服务器失败");
		}


	}


	// 读操作
	public void readMsg() throws IOException {
		String msg = dis.readUTF();
		area.append("server:" + msg + "\n");
	}


	// 写操作
	public void writeMsg(String msg) {
		// System.out.println("请输入要发送到服务器端的信息:");
		try {
			dos.writeUTF(msg);
			dos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}


		area.append("client:" + msg + "\n");


	}


	// 子线程 不停的读取信息
	public void run() {


		while (true) {
			try {
				this.readMsg();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}


	public static void main(String[] args) throws UnknownHostException,
			IOException {

	<span style="white-space:pre">	</span>ClientFrameTest cd3 = new ClientFrameTest();
		
	}


	public void actionPerformed(ActionEvent e) {
		// 得到文本框中的信息,调用输出方法,将信息输出
		String msg = txt.getText();

		this.writeMsg(msg);


		txt.setText("");


	}
}


  1. import java.awt.event.ActionEvent;  
  2. import java.awt.event.ActionListener;  
  3. import java.io.BufferedReader;  
  4. import java.io.DataInputStream;  
  5. import java.io.DataOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.net.ServerSocket;  
  9. import java.net.Socket;  
  10. import javax.swing.JButton;  
  11. import javax.swing.JFrame;  
  12. import javax.swing.JPanel;  
  13. import javax.swing.JScrollPane;  
  14. import javax.swing.JTextArea;  
  15. import javax.swing.JTextField;  
  16.   
  17.   
  18.   
  19. //服务器  
  20. public class ServerFrameTest extends JFrame implements Runnable,  
  21.         ActionListener {  
  22.     DataOutputStream dos = null;  
  23.     DataInputStream dis = null;  
  24.     BufferedReader br = null;  
  25.     // 声明出界面上所要使用的组件.  
  26.     JTextArea area = new JTextArea(1630);  
  27.     JScrollPane jsp = new JScrollPane(area);  
  28.     JTextField txt = new JTextField(24);  
  29.     JButton btn = new JButton("发送");  
  30.     JPanel panel = new JPanel();  
  31.   
  32.     public ServerFrameTest() {  
  33.         super("服务器端");  
  34.         btn.addActionListener(this);  
  35.         txt.addActionListener(this);  
  36.         area.setEditable(false); // 文本域不可编辑  
  37.         area.setLineWrap(true);  
  38.   
  39.   
  40. <span style="white-space:pre">    </span>   panel.add(jsp);  
  41.         panel.add(txt);  
  42.         panel.add(btn);  
  43.         this.getContentPane().add(panel);  
  44.         this.setBounds(100100400400);  
  45.         this.setDefaultCloseOperation(3);  
  46.         this.setVisible(true);  
  47.         this.initServer();  
  48.         new Thread(this).start();  
  49.     }  
  50.   
  51.   
  52.     // 服务器初始化  
  53.     public void initServer() {  
  54.         // 创建服务器  
  55.         ServerSocket server;  
  56.         try {  
  57.             server = new ServerSocket(9999);  
  58.             // 接收一个客户端的请求  
  59.             Socket socket = server.accept();  
  60.   
  61.             // 服务器向客户端发送信息 输出流.  
  62.             dos = new DataOutputStream(socket.getOutputStream());  
  63.   
  64.   
  65.             // 定义一个可以从键盘接收数据的流.  
  66.             // br = new BufferedReader(new InputStreamReader(System.in));  
  67.   
  68.   
  69.             // 服务器读取客户端发送的信息 输入流  
  70.             dis = new DataInputStream(socket.getInputStream());  
  71.         } catch (IOException e) {  
  72.             System.out.println("服务器创建失败");  
  73.         }  
  74.   
  75.   
  76.     }  
  77.   
  78.     // 读操作  
  79.     public void readMsg() throws IOException {  
  80.         String msg = dis.readUTF();  
  81.   
  82.         // 将读到的信息显示在文本域中  
  83.         area.append("client:" + msg + "\n");  
  84.     }  
  85.   
  86.   
  87.     // 写操作  
  88.     public void writeMsg(String msg) {  
  89.         try {  
  90.               
  91.             dos.writeUTF(msg);  
  92.             dos.flush();  
  93.         } catch (IOException e) {  
  94.   
  95.   
  96.             e.printStackTrace();  
  97.         }  
  98.   
  99.         area.append("server:" + msg + "\n");  
  100.   
  101.   
  102.     }  
  103.   
  104.     // 子线程 不停的读取信息  
  105.     public void run() {  
  106.   
  107.         while (true) {  
  108.             try {  
  109.                 this.readMsg();  
  110.             } catch (IOException e) {  
  111.                 e.printStackTrace();  
  112.             }  
  113.         }  
  114.     }  
  115.   
  116.     public static void main(String[] args) throws IOException {  
  117.         ServerFrameTest sd3 = new ServerFrameTest();  
  118.     }  
  119.   
  120.     public void actionPerformed(ActionEvent e) {  
  121.         // 得到文本框中的信息,调用输出方法,将信息输出  
  122.         String msg = txt.getText();  
  123.   
  124.         this.writeMsg(msg);  
  125.   
  126.         txt.setText("");  
  127.   
  128.     }  
  129. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值