黑马程序员 网络编程学习

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

 

实现计算机互联的三要素:

1、IP地址

        本机回路IP:127.0.0.1

2、端口号(逻辑端口):用于标识应用程序。

       端口号0~65535之间的整数;0~1024之间大部分已被用于一些知名的网络服务和应用,所以现在开发的网络应用程序端口号一般是1024以后的整数。

3、通信协议

       TCP:三次握手机制,面向连接,稍慢。可靠

       UDP:无连接,每个数据报大小限制在64K内。传输快。不可靠。

 

网络参考模型

TCP/IP参考模型

应用层:javaWeb开发

传输层:TCP/UDP

网际层:IP

主机至网络层:有线还是无线,光纤还是电话线等

 

描述IP的java包:java.net 下的InetAddress类。

 

mport java.net.InetAddress;
import java.util.Arrays;

public class IPDemo {

	public static void main(String[] args) throws Exception {
		/*InetAddress i = InetAddress.getLocalHost();
		
		//本机主机地址、主机名
		String ip = i.getHostAddress() + "..." + i.getHostName();
		System.out.println(ip);*/
		
		//获取任意一台主机信息
		InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
		for(InetAddress ia : ias) {
			System.out.println(ia.getHostAddress() + "..." + ia.getHostName());
		}
	}

}


网络编程:其实就是Socket编程

通信的两端都有Socket, 数据在两个Socket间通过IO传输。

 

UDP传输:DatagramSocket和DatagramPacket

 一个简单的UDP通信示例

class UDPsend {
	public static void main(String[] args) throws Exception {
		//创建UDP socket端点,可以指定固定端口发送数据,不指定则系统随机产生
		DatagramSocket ds = new DatagramSocket();
		//确定数据,并封装成数据包
		byte[] buf = "Hello, java".getBytes();
		DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);
		
		//通过UDP socket的sent方法发送数据
		ds.send(dp);
		System.out.println("发送成功");
	}
}

class UDPreceive {
	public static void main(String[] args) throws Exception {
		//创建UDP socket端点,指定用于接收数据的端口
		DatagramSocket ds = new DatagramSocket(8888);
		//定义数据包用于接收数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, 0, 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 + ", " + port + ", " + data);
		
		ds.close();
	}
}



 需求:用TCP完成一个英文文本大小写转换的客户端和服务器端

客户端发送一个英文字符串到服务端,服务端返回一个将字符串转为全大写后的信息到客户端

import java.net.*;
import java.io.*;
/*
 * 建立一个文本转换器
 * 
 * 分析:操作的是客户端发来的文本信息数据,所以要用到IO流技术。
 * 
 * 步骤:
 * 1、建立服务
 * 2、获取键盘录入
 * 3、将数据发给服务端
 * 4、服务端将小写字母全部转换为大写后发送给客户端
 * 5、关闭资源
 * */
public class TCPTextCast {

	public static void main(String[] args) {

	}

}
class TCPClient1 {
	
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1", 10003);
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		//优化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);
		//将bufOut传入PrintWriter(bufOut)也行
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		String line = null;
		while((line=br.readLine())!= null) {
			if("over".equals(line))
				break;
			bufOut.write(line);
			bufOut.newLine();
			bufOut.flush();
			//三句变一句,用out.println(line);
			
			System.out.println("Server: " + bufIn.readLine());
		}
		
		br.close();
		s.close();
	}
	
}
class TCPServer1 {
	
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10003);
		Socket s = ss.accept();
		
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + "...connceted");
		
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		
		String data = null;
		while((data=br.readLine()) != null) {
			
			System.out.println(ip + "... : " + data);
			
			bw.write(data.toUpperCase());
			bw.newLine();
			bw.flush();
		}
			
		s.close();
		ss.close();
	}
	
}


 

 TCP上传文件实例代码:

/*
 * 使用TCP协议写一个可以上传文件的服务器和客户端。
 * 
 * 思路:网络编程与IO流相拼命
 * 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream.
 * 	还有通过socket的输入流读取服务器端的反馈信息。
 * 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息 
 * 资源关闭
 * */

import java.net.*;
import java.io.*;
public class FileLoader {

	public static void main(String[] args) {

	}

}

//客户端
class client {
	public static void main(String[] args) throws Exception {
		//建立Socket服务
		Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);
		//从客户端本地读取文件,并写入socket的输出流中
		OutputStream out = fileLoaderSocket.getOutputStream();
		InputStream fileRead = new FileInputStream("G:\\Demo.mp3");
		
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=fileRead.read(buf)) != -1) {
			out.write(buf, 0, len);
		}
		//告诉服务端,文件已传输完毕
		fileLoaderSocket.shutdownOutput();
		
		//获取从服务端反馈的信息
		BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));
		String serverBack = in.readLine();
		System.out.println(serverBack);
		
		//资源关闭
		fileLoaderSocket.close();
		fileRead.close();
	}
}

//服务端
class Server {
	public static void main(String[] args) throws Exception {
		//建立服务端Socket
		ServerSocket ss = new ServerSocket(10005);
		//接收客户端Socket
		Socket fileLoaderSocket = ss.accept();
		
		//打印连接信息
		String ip = fileLoaderSocket.getInetAddress().getHostAddress();
		System.out.println(ip + "...conncected");
		
		//接收文件,并保存
		InputStream in = fileLoaderSocket.getInputStream();
		OutputStream fileSave = new FileOutputStream("E:\\server.mp3");
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=in.read(buf)) != -1) {
			fileSave.write(buf, 0, len);
			fileSave.flush();
		}
		//返回文件复制情况信息
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));
		out.write("文件上传成功");
		out.flush();
		
		//资源关闭
		ss.close();
		fileLoaderSocket.close();
		fileSave.close();
	}
}

 

 public Socket() 到底连接哪台主机?

 它是用

public void connect(SocketAddress endpoint,int timeout) throws IOException

SocketAddress是abstract类,它有个子类InetSocketAddress ,此类实现 IP 套接字地址(IP 地址 + 端口号)。


 

 ServerSocket可以指定能连接客户端的最大数:

public ServerSocket(int port,int backlog) throws IOException

 

域名解析:

1、首先找本机 C:\WINDOWS\system32\drivers\etc 下的hosts文件配对

2、若上述文件中不存在映射(域名-IP),则进行下面的步骤:

 

 

 

 

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

 详情请查看:http://edu.csdn.net/heima

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值