现在的位置: 首页 > 综合 > 正文

Java基础之网络编程

2013年01月02日 ⁄ 综合 ⁄ 共 4187字 ⁄ 字号 评论关闭

概念

网络参考模型
      OSI参考模型
      TCP/IP参考模型

网络通讯要素
IP地址:InetAddress
       网络中设备的标识 。
       不易记忆,可用主机名。
       本地回环地址:127.0.0.1  主机名:localhost 。
端口号:用于标识进程的逻辑地址,不同进程的标识 。
       有效端口:0~65535,其中0~1024系统使用或保留端口。 
       传输协议:通讯的规则。
常见协议:TCP,UDP,还有别的协议。如果双方想要通信,必须要使用相同的协议才可以。

UDP和TCP

UDP
        1、将数据源和目的地封装到数据包中,不需要建立连接
        2、每个数据包的大小限制在64k以内
        3、因无连接,是不可靠协议
        4、不需要建立连接,速度快
TCP
        1、建立连接,形成传输数据的通道
        2、在连接中进行大量数据的传输
        3、通过三次握手完成连接、是可靠协议
        4、必须建立连接,效率会稍低
Scoket
Socket就是为网络服务提供的一种
通信的两端都有Socket。
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输。

UDP传输

DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
发送端
1、建立udpsocket服务
2、提供数据,并将数据封装到数据包中
3、通过socket服务的发送功能,数据包发送出去
4、关闭资源
public class UdpSend {
	public static void main(String[] args) throws Exception {
		// 创建UDP服务 通过DatagramSocket对象
		DatagramSocket ds = new DatagramSocket();
		// 确定数据并封装成数据包
		byte[] data = "你好".getBytes();
		DatagramPacket dp = new DatagramPacket(data, data.length,
				InetAddress.getByName("10.13.241.240"), 10000);
		// 发送数据
		ds.send(dp);
		// 关闭服务
		ds.close();
	}
}

接收端

1、定义udpsocket服务,通常会监听一个端口,其实就是给这个网络应用程序定义一个数字标识
              方便于明确那些数据过来该应用应用程序能够处理
2、定义一个数据包,因为要存储接收到的字节数据
              因为数据包中有更多功能可以提取字节数据中的不同数据信息。
3、通过socket服务的receive方法将接受到的数据存入已定义好的数据包中。
4、通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5、关闭资源
public class UdpRece {
	public static void main(String[] args) throws Exception {
		// 1、创建udpsocket建立端点
		DatagramSocket ds = new DatagramSocket(10000);
		// 2、定义数据包,用于存储数据
		while (true) {
			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);
		}
//		ds.close();//如果要一直接收数据,服务不要关
	}
}

TCP传输

Tcp分客户端和服务端 客户端对应Socket 服务端对应ServerSocket 
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器端是两个独立的应用程序。

客户端
通过查阅Socket对象,发现该对象在建立时,就可以去连接指定主机。
因为tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功
形成通路后,在该通道进行数据传输
public class TcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("10.13.241.240", 10000);
		//为了发送数据,应该获取cocket流中的输出流
		OutputStream out=socket.getOutputStream();
		out.write("nihao".getBytes());
		//为了接受数据,应该获取cocket流中的输入流
		InputStream in=socket.getInputStream();
		byte [] buf=new byte[1024];
		int len=in.read(buf);
		System.out.println(new String (buf,0,len));
		socket.close();
	}
}

服务端

1、建立服务端的socket服务,通过ServerSocket(),并监听一个端口
2、获取连接过来的客户端对象,通过sccept方法,这个方法是阻塞式的
3、客户端如果发来数据,服务端需要使用对应的客户端对象,并使用该对象的读取流来读取发过来的数据
4、关闭服务器(可选)
public class TcpServer {
	public static void main(String[] args) throws UnknownHostException, IOException {
		// 建立服务端的scoket服务,并监听一个端口
		ServerSocket server = new ServerSocket(10000);
		//通过accept方法获取连接过来的客户端对象
		Socket socket = server.accept();
		String ip=socket.getInetAddress().getHostAddress();
		System.out.println(ip+"....connect");
		//获取客户端发过来的数据,那么要使用对象的读取流来读取数据
		InputStream is=socket.getInputStream();
		byte buf[]=new byte[1024];
		int len=is.read(buf);
		System.out.println(new String(buf,0,len));
		//通过输出流想客户端发送数据
		OutputStream out=socket.getOutputStream();
		out.write("niyehao".getBytes());
		socket.close();
		server.close();
	}
}

通过客户端上传文件到服务器

客户端代码
public class UploadClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s = new Socket("10.13.252.9", 10003);
		//定义读取文件对象。
		BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\testjava\\222.mp3"));
		//定义目的,将数据写入到socket输出流。发给服务端。
		BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
		
		int len=0;
		while((len=bis.read())!=-1){
			bos.write(len);
		}
		s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
		//定义一个socket读取流,读取服务端返回的信息。
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

		String str = bufIn.readLine();
		System.out.println(str);
		bis.close();
		s.close();
	}
}

服务端代码

public class UploadServer {

	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10003);
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");
		//读取socket读取流中的数据。
		InputStream in=s.getInputStream();
		//目的socket输出流。写入到socket输出流
		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\testjava\\server.mp3"));
		
		int len=0;
		while((len=in.read())!=-1){
			bos.write(len);
		}
		PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
		pw.println("上传成功");
		bos.close();
		s.close();
		ss.close();
	}
}



抱歉!评论已关闭.