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

网络编程1

2015-08-08 10:25 519 查看

-网络编程概述
网络模型:1、OSI(Open System Interconnection 开放系统互连)参考模型
2、TCP/IP 参考模型
网络通信要素:
1、IP地址
2、端口号
3、传输协议
-网络参考模型
OSI参考模型:应用层,表示层、会话层、传输层、网络层、数据链路层、物理层(分7层)
TCP/IP参考模型:应用层、传输层、网际层、主机至网络层(分4层)
-网络通信要素
IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024一般是系统使用或保留的端口
传输协议
通信的规则
常见协议:TCP/IP、UDP、
-TCP与UDP
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、可用于传输大量数据 (流 模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
TCP协议常用于:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协 议)。TCP用于传输数据量大,可靠性要求高的应用。
UDP:面向非连接、传输不可靠、用于传输少量数据(<64K数据包模式)、速度快。
UDP协议常用于:即时聊天应用、视频会议、桌面共享等。

-获取IP地址、主机名等信息的代码例子



package day23_NetworkProgramming;

import java.net.InetAddress;

//学习InetAddress
public class Day23_04_InetAddress {

public static void main(String[] args) throws Exception {

InetAddress i = InetAddress.getLocalHost();

System.out.println(i.toString());
System.out.println("address:"+i.getHostAddress());
System.out.println("name:"+i.getHostName());


InetAddress ia = InetAddress.getByName("www.baidu.com");
System.out.println("address:"+ia.getHostAddress());
System.out.println("name:"+ia.getHostName());
}

}


-Socket概要
1、socket就是为网络服务提供的一种机制
2、通信两端都要有Socket
3、网络通信其实就是Socket间的通信
4、数据在两个socket间通过IO传输

-通过upd服务发送数据
需求:通过udp传输方式,将一段文件数据发送出去。
分析步骤:
1、建立updsocket服务
2、提供要发送的数据,并将数据封装到数据包中
3、通过socke服务的发送功能(send()方法),将数据发送出去
4、关闭资源




import java.net.*;

public class Day23_07_UdpSendDemo {

public static void main(String[] args) throws Exception {
//1、创建upd服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();//可以给该程序指定一个端口

//2、确定发送数,并封装成数据包。
//DatagramPacket(byte[] buf,int length,InetAddress address,int port)
byte[] buf = "data send by udp".getBytes();
DatagramPacket dp =
new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10000);

//3、通过socket服务,使用send()方法将已有的数据包发送出去
ds.send(dp);

//4、关闭资源
ds.close();

}

}



-学习通过upd接收端接收数据
需求:定义一个应用程序,用于接收udp协议传输的数据并做相关处理。
分析步骤:
1、定义udp socket方法;通常会监听一个端口,作用其实就是方便于明确那些数据
过来是该应用程序可以处理的。
2、定义一个数据包,用于存储接收到的数据。(数据包中有更多功能可以提取字节数据
中的不同数据信息)
3、通过socke服务的receive()方法将接收到的数据存入已定义好的数据包中。
4、通过数据包对象的特有功能,将这些不同的数据去程,打印在控制台。
5、关闭资源



import java.net.*;

public class Day23_08_UdpReceiveDemo {

public static void main(String[] args) throws Exception {
//1、创建upd socket,建立端点
DatagramSocket ds = new DatagramSocket(10000);//监听10000端口

//2、定义数据包,用于存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);

//3、通过服务的receive()方法将接收到的数据存入到数据包中
ds.receive(dp);

//4、通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();

System.out.println(ip+"::"+data+"::"+port);
//5、关闭资源
ds.close();

}

}


-通过upd协议发送接收端接收数据方式二
接收端代码:



package day23_NetworkProgramming;

import java.net.*;

public class Day23_09_UdpReceiveDemo2 {

public static void main(String[] args) throws Exception {

DatagramSocket ds = new DatagramSocket(10001);

while(true){

byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);

ds.receive(dp);

String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();

System.out.println(ip+"::"+data+"::"+port);
}
}
}




发送端代码:



package day23_NetworkProgramming;

import java.io.*;
import java.net.*;
/**
* 学习通过upd服务发送数据(通过键盘录入数据)
* @author Administrator
*
*/
public class Day23_09_UdpSendDemo2 {

public static void main(String[] args) throws Exception {

//1、创建upd服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();

//2、确定发送数,并封装成数据包。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null){
if("88".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10001);

//3、通过socket服务,使用send()方法将已有的数据包发送出去
ds.send(dp);
}

//4、关闭资源
ds.close();
}

}




练习:建立一个文本转换服务器,实现客户端给服务端发送文本,服务端将文本
转换成大写后返回给客户端。客户端可以不断的输入,当输入over时,
结束转换。

分析步骤:
1、建立服务
2、获取键盘录入数据
3、将数据发送给服务端
4、服务端给客户端返回转换后的数据
5、转换结束,关闭资源
接收端:



package day23_NetworkProgramming;

import java.net.*;
import java.io.*;


//服务端
class Day23_13_TCPTransPracticeServer {

public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
try {
ss = new ServerSocket(10005);
s = ss.accept();

//读取socket流中的数据
BufferedReader socketBr =
new BufferedReader(new InputStreamReader(s.getInputStream()));

//通过socket流 将转换后的数据发送回客户端
//BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);

String line = null;
while((line=socketBr.readLine())!=null){

System.out.println(line);
//socketBw.write(line.toUpperCase());
//socketBw.newLine();
//socketBw.flush();

socketPw.println(line.toUpperCase());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}




发送端:



package day23_NetworkProgramming;

import java.net.*;
import java.io.*;

//客户端
class Day23_13_TCPTransPracticeSend {

public static void main(String[] args) {
try {
Socket s = new Socket("10.0.7.213", 10005);

//定义读取键盘数据的流对象
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//定义目的,将数据写入到socket输出流中,发送给服务端
//BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);

//定义一个socket读取流,读取服务端返回转换后的数据
BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream()));

String line = null;
while((line=br.readLine())!=null){
if("over".equals(line))
break;
//socketBw.write(line);
//socketBw.newLine();
//socketBw.flush();
socketPw.println(line);

//服务端返回转换后的数据
String str = socketBr.readLine();
System.out.println("server: "+str);
}
} catch (Exception e) {
e.printStackTrace();
}
}

}



-练习:通过TCP的网络传输复制一个文本文件
具体代码如下:



package day23_NetworkProgramming;

import java.net.*;
import java.io.*;

//服务端
class Day23_14_CopyByTCPPracticeServer {

public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10006);
Socket s = ss.accept();

//显示客户端连接的ip
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected");

BufferedReader socketBr =
new BufferedReader(new InputStreamReader(s.getInputStream()));

PrintWriter pw = new PrintWriter(new FileWriter("copyByTCP.txt"),true);

String line = null;
while((line=socketBr.readLine())!=null){
pw.println(line);
}
PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true);
socketPw.println("上传成功");

pw.close();
s.close();
ss.close();
}

}





package day23_NetworkProgramming;

import java.net.*;
import java.io.*;

//客户端
class Day23_14_CopyByTCPPracticeClient {

public static void main(String[] args) throws Exception {
Socket s = new Socket("10.0.7.213",10006);

BufferedReader br = new BufferedReader(new FileReader("demo.txt"));

PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

String line = null;
while((line=br.readLine())!=null){
pw.println(line);
}
s.shutdownOutput();

BufferedReader socketBr =
new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = socketBr.readLine();
System.out.println(str);

br.close();
pw.close();
s.close();

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: