黑马程序员_JavaSE基础知识总结十八:网络编程

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



一、协议(TCP/IP)

    TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

TCP/IP协议的由来

    在阿帕网(ARPR)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容,在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。

 

互联网之父--瑟夫(Vinton G.Cerf)

1997年,为了褒奖对因特网发展作出突出贡献的科学家,并对TCP/IP协议作出充分肯定,美国授予为因特网发明和定义TCP/IP协议的文顿·瑟夫和卡恩“国家技术金奖”。这无疑使人们认识到TCP/IP协议的重要性。

tcp/ip基础--ip地址与包的路由传递

ip地址

概述:每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,所有ip地址都是32位的,ip地址按照国际标准的划分为a,b,c,d,e五种类型。


UDP:      1.将数据及源和目的封装成数据包中,不需要建立连接。
 *         2.每个数据报包的大小在限制在64k内。
 *         3.因无连接,是不可靠的协议。
 *         4.不需要建立连接,速度快。
 *        
 *         主要应用:视频电话会议系统、传输视频、mp3等
 *        
 *  
 *         

TCP:      1.建立连接,形成传输数据的通道。
 *         2.在连接中进行大数据传输。
 *         3.通过三次握手完成连接,是可靠协议。
 *         4.因为必须建立连接,所以效率会稍低。
 *        
 *         主要应用:TCP协议中植入了各种安全保障功能,广泛用于数据下载、文件传输、可靠性要求高的应用

 */




二、端口(port)--概念

    在网络技术中,端口(Port)有好几种意思。集线器、交换机、路由器的端口指的是连接其他网络设备的接口,如RJ-45端口、Serial端口等。我们这里所指的端口不是指物理意义上的端口,而是特指TCP/IP协议中的端口,是逻辑意义上的端口。

    如果把IP地址比作一间房子,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:256*256)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0到65535(256*256-1)。

 

端口(port)--分类

有65536个端口0号是保留端口

1-1024是固定端口

又叫有名端口,即被某些程序固定使用,一般程序员不使用。

22:SSH远程登录协议23:telnet使用21:ftp使用

25:smtp服务使用80:iis使用7:echo服务

1025-65535是动态端口

这些端口,程序员可以使用

 

端口(port)--注意事项

1、在计算机(尤其是做服务器)要尽可能的少开端口;

2、一个端口只能被一个程序监听;

3、如果使用netstat -an可以查看本机有哪些端口在监听

4、可以使用netstat -anb来查看监听端口的pid,在结合任务管理器关闭不案例的端口。

 

三、url--概念

    统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。

    Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点,简单地说,URL就是Web地址,俗称“网址”,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。

 

url--组成

http://www.sina.com:8080/index.html

1、协议;2、ip地址(32位);3、端口号(16位)0-65535;4、资源名称。

 

单工、半双工和全双工

    如果甲可以向乙发送数据,但是乙不能向甲发送数据,这样的通信就是单工通信(Simplex Communication)。

    单工数据传输只支持数据在一个方向上传输,就和传呼机一样。

    半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,就和对讲机(步话机)一样;

全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,就和电话一样。

半双工网络C/S

[MyServer.java]


<span style="font-size:18px;color:#333333;">/**
 * 这是第一个服务器端程序,让它在9999端口监听
 * 可以接收客户端发来的数据
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class MyServer {
	public static void main(String[] args) {
		new MyServer();
	}
	
	//构造函数
	public MyServer(){
		try {
			//在9999号端口上监听
			ServerSocket ss=new ServerSocket(9999);
			System.out.println("9999端口监听...");
			//等待某个客户端来连接,该函数会返回一个Socket连接
			Socket s=ss.accept();
			//要读取s中传递的数据
			InputStreamReader isr=new InputStreamReader(s.getInputStream());
			BufferedReader br=new BufferedReader(isr);
			
			String info=br.readLine();
			System.out.println("服务器接收到:\t"+info);
			
			PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
			pw.println("我是服务器,已收到你发送的信息!");
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}</span>

[MyClient.java]

<del><span style="font-size:18px;color:#333333;">/**
 * 这是一个客户端程序,可以连接服务器端口9999
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class MyClient {
	public static void main(String[] args) {
		new MyClient();
	}
	
	public MyClient(){
		try {
			//Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
			//9999是服务器的端口号
			Socket s=new Socket("127.0.0.1",9999);
			//如果s连接成功,就可以发送数据到服务器端
			//我们通过pw向s写数据,true表示即时刷新
			PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
			pw.println("你好吗?我是客户端");
			//要读取s中传递的数据
			InputStreamReader isr=new InputStreamReader(s.getInputStream());
			BufferedReader br=new BufferedReader(isr);
			String info=br.readLine();
			System.out.println("接收到服务器:\t"+info);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
</span></del>

半双工,客户端与服务端进行控制台输入交流

[MyServer2.java]服务代码

<span style="font-size:18px;color:#333333;">/**
 * 功能:是一个服务器端,在9999端口上监听
 * 可以通过控制台,输入回送给客户端的信息
 */
package com.net.server2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class MyServer2 {
	InputStreamReader isr,isr2;
	BufferedReader br,br2;
	PrintWriter pw;
	
	public static void main(String[] args) {
		new MyServer2();
	}

	//构造函数
	public MyServer2(){
		try {
			//在9999号端口上监听
			ServerSocket ss=new ServerSocket(9999);
			//等待客户端连接,该函数会返回一个Socket连接
			Socket s=ss.accept();
			//要读取s中传递的数据
			isr=new InputStreamReader(s.getInputStream());
			br=new BufferedReader(isr);
			
			pw=new PrintWriter(s.getOutputStream(),true);
			
			//接收从控制台输入的信息
			isr2=new InputStreamReader(System.in);
			br2=new BufferedReader(isr2);
			while(true){
				//接收客户端信息
				String infoFromClient=br.readLine();
				System.out.println("服务器接收到:\t"+infoFromClient);
				//接收从控制台输入的信息
				System.out.println("请输入要发送到客户端的信息:");
				String response=br2.readLine();
				//服务器从控制台上接收bye服务器端退出
				if(response.equals("bye")){
					System.out.println("退出对话");
					s.close();
					break;
				}
				//把从控制台输入的信息,回送给客户端
				pw.println(response);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(br2!=null) br2.close();
				if(isr2!=null) isr2.close();
				if(pw!=null) pw.close();
				if(br!=null) br.close();
				if(isr!=null) isr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}</span>

[MyClient2.java]客户端源代码

<span style="font-size:18px;color:#333333;">/**
 * 这是一个客户端程序,可以连接服务器端口9999
 */
package com.net.client2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class MyClient2 {
	InputStreamReader isr,isr2;
	BufferedReader br,br2;
	PrintWriter pw;
	
	public static void main(String[] args) {
		new MyClient2();
	}
	
	public MyClient2(){
		try {
			//连接服务器端
			Socket s=new Socket("127.0.0.1",9999);
			
			pw=new PrintWriter(s.getOutputStream(),true);
			//控制台接收信息
			isr=new InputStreamReader(System.in);
			br=new BufferedReader(isr);
			
			//从服务器接收信息
			isr2=new InputStreamReader(s.getInputStream());
			br2=new BufferedReader(isr2);
			
			while(true){
				//客户端先从控制台接收
				String info=br.readLine();
				//然后发送给服务器
				pw.println(info);
				//客户端从控制台上输入byebye信息,客户端退出
				if(info.equals("byebye")){
					System.out.println("客户端退出对话");
					s.close();
					break;
				}
				
				//接收从服务器发来的信息
				String res=br2.readLine();
				System.out.println("客户端接收到的信息:"+res);
				//客户端接收服务端发送来的byebye信息,客户端退出
				if(res.equals("byebye")){
					System.out.println("服务器端强制客户端退出对话");
					s.close();
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(br2!=null) br2.close();
				if(isr2!=null) isr2.close();
				if(pw!=null) pw.close();
				if(br!=null) br.close();
				if(isr!=null) isr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}</span>

全双工客户端与服务器进行简易界面聊天

[MyServer3.java]服务器端源代码

<span style="font-size:18px;color:#333333;">/**
 * 全双工服务器端,让它在9999端口监听
 * 可以接收客户端发来的数据
 */
package com.net.server3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class MyServer3 extends JFrame implements ActionListener{
	JTextArea jta;
	JTextField jtf;
	JButton jb;
	JPanel jp1;
	JScrollPane jsp;
	
	InputStreamReader isr;
	BufferedReader br;
	PrintWriter pw;
	
	public static void main(String[] args) {
		new MyServer3();
	}
	
	//构造函数
	public MyServer3(){
		jta=new JTextArea();
		jtf=new JTextField(20);
		jb=new JButton("发送");
		jb.addActionListener(this);
		//给jb发送按钮添加快捷键(回车)事件
		jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
		jb.getActionMap().put("fasong", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				String info=jtf.getText();
				jta.append("客户端 对 服务端说:"+info+"\r\n");
				pw.println(info);
				jtf.setText("");
			}
		});
		
		jp1=new JPanel();
		jp1.add(jtf);
		jp1.add(jb);
		jsp=new JScrollPane(jta);
		this.add(jsp,"Center");
		this.add(jp1,"South");
		this.setTitle("qq简易聊天--服务端");
		this.setSize(350, 250);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
		try {
			//在9999号端口上监听
			ServerSocket ss=new ServerSocket(9999);
			//等待客户端连接
			Socket s=ss.accept();
			//读取从客户端发来的信息
			isr=new InputStreamReader(s.getInputStream());
			br=new BufferedReader(isr);
			pw=new PrintWriter(s.getOutputStream(),true);
			while(true){
				//读取从客户端发来的信息
				String info=br.readLine();
				jta.append("客户端 对 服务端说:"+info+"\r\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(pw!=null) pw.close();
				if(br!=null) br.close();
				if(isr!=null) isr.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		//如果用户按下发送信息的按钮
		if(e.getSource()==jb){
			//把服务器在jtf写的 内容发送给客户端
			String info=jtf.getText();
			//向jta中不断追加内容
			jta.append("服务端 对 客户端说:"+info+"\r\n");
			pw.println(info);
			//清空jtf内容
			jtf.setText("");
		}
	}
}</span>
<span style="font-size:18px;color:#333333;">[MyClient3.java]客户端源代码
/**
 * 这是一个客户端程序,可以连接服务器端口9999
 */
package com.net.client3;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class MyClient3 extends JFrame implements ActionListener{
	JTextArea jta;
	JTextField jtf;
	JButton jb;
	JPanel jp1;
	JScrollPane jsp;
	
	InputStreamReader isr;
	BufferedReader br;
	PrintWriter pw;
	
	public static void main(String[] args) {
		new MyClient3();
	}
	
	public MyClient3(){
		jta=new JTextArea();
		jtf=new JTextField(20);
		jtf.setFocusable(true);
		jb=new JButton("发送");
		jb.addActionListener(this);
		//给jb发送按钮添加快捷键(回车)事件
	jb.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "fasong");
		jb.getActionMap().put("fasong", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				String info=jtf.getText();
				jta.append("客户端 对 服务端说:"+info+"\r\n");
				pw.println(info);
				jtf.setText("");
			}
		});
		
		jp1=new JPanel();
		jp1.add(jtf);
		jp1.add(jb);
		jsp=new JScrollPane(jta);
		this.add(jsp,"Center");
		this.add(jp1,"South");
		
		this.setTitle("qq简易聊天--客户端");
		this.setSize(350, 250);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		
		try {
			//Socket()就是去连接某个服务器端 127.0.0.1表示服务器的ip
			Socket s=new Socket("127.0.0.1",9999);

			InputStreamReader isr=new InputStreamReader(s.getInputStream());
			BufferedReader br=new BufferedReader(isr);
			pw=new PrintWriter(s.getOutputStream(),true);
			while(true){
				//读取服务器端发来的信息
				String info=br.readLine();
				jta.append("服务端 对 客户端说:"+info+"\r\n");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(pw!=null) pw.close();
				if(br!=null) br.close();
				if(isr!=null) isr.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==jb){
			String info=jtf.getText();
			jta.append("客户端 对 服务端说:"+info+"\r\n");
			pw.println(info);
			jtf.setText("");
		}
	}
}</span>













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值