您的位置:首页 > 理论基础 > 计算机网络

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

2015-11-14 10:19 736 查看
------ 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.JButto
b000
n;
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: