java网络编程

网络编程:

互联网中的IP地址 InetAddress

 

/**
 端口号:逻辑端口由操作系统负责,对每个程序进行分配
0-65535  1024之前的端口号被系统的软占用了
http:www.xxxx.com:80  默认
 */
package net1;

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 * 表示互联网中的IP地址
 * 	java.net.InetAddress
 * 静态方法:
 * 	static InetAddrss getLocalHost()  本地主机
 * 	static InetAdderss getByName(String hostName)	传递主机名,获取IP地址对象
 * 
 * 非静态方法:
 * 	String getHostName()  获取主机名
 * 	String getHostAddress()	获取主机地址
 */
public class InetAddressDemo {
	public static void main(String[] args) throws UnknownHostException {
//		function();
		function_2();
	}

	private static void function_2() throws UnknownHostException {
		InetAddress inet = InetAddress.getByName("comput");
		System.out.println(inet);
	}

	private static void function() throws UnknownHostException {
		//输出结果就是主机名和ip地址
		System.out.println(InetAddress.getLocalHost());
		InetAddress inet = InetAddress.getLocalHost();
		String host = inet.getHostName();
		String add = inet.getHostAddress();
		System.out.println(host + add);
	}
	
}

端口号:逻辑端口由操作系统负责,对每个程序进行分配

0-65535  1024之前的端口号被系统的软占用了

http:www.xxxx.com:80  默认

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 * 表示互联网中的IP地址
 * 	java.net.InetAddress
 * 静态方法:
 * 	static InetAddrss getLocalHost()  本地主机地址
 * 	static InetAdderss getByName(String hostName)	传递主机名,获取IP地址对象
 * 
 * 非静态方法:
 * 	String getHostName()  获取主机名
 * 	String getHostAddress()	获取主机地址
 */
public class InetAddressDemo {
	public static void main(String[] args) throws UnknownHostException {
//		function();
		function_2();
	}

	private static void function_2() throws UnknownHostException {
		InetAddress inet = InetAddress.getByName("comput");
		System.out.println(inet);
	}

	private static void function() throws UnknownHostException {
		//输出结果就是主机名和ip地址
		System.out.println(InetAddress.getLocalHost());
		InetAddress inet = InetAddress.getLocalHost();
		String host = inet.getHostName();
		String add = inet.getHostAddress();
		System.out.println(host + add);
	}
	
}

UDP:

 

/*

 * UDP  是无连接通信协议

 *   数据限制在64kb以内

 *   发送端不用确定接收端是否在线就会发出数据

 *   接收端收到数据时也不会反馈是否收到数据

 * 消耗资源小,效率高,即使丢失部分数据包,也不会对结果产生太大影响

 *

 * TCP   面向连接的协议

 *   传输数据前先建立连接,提供毫无差错的数据传输

 */

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 实现UDP协议的发送端:
 * 	实现封装数据的类:java.net.DatagramPacket		将数据包装
 * 	实现数据传输的类:java.net.DatagramSocket		将数据包发出去
 * 
 * 实现步骤:
 * 	1.创建DatagramPacket对象,封装数据,接收的地址和端口
 * 	2.创建DatagramScoket对象
 * 	3.调用DatagramScoket类方法send,发送数据包
 * 	4.关闭资源
 * 
 * DatagramPacket构造方法:
 * 		DatagramPacket(byte[] buf,int length,InetAddress address,int port)
 * DatagramScoket构造方法:
 * 		DategramSocket()
 * 		方法:send(DategramPacket d) 
 */
public class UDPsend {
	public static void main(String[] args) throws IOException{
		InetAddress inet = InetAddress.getByName("127.0.0.1");
		byte[] buf = "hello".getBytes();
		DatagramPacket dp = new DatagramPacket(buf,buf.length,inet,6000);
		DatagramSocket ds = new DatagramSocket();
		ds.send(dp);
		ds.close();
	}
}

package udpDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * 实现UDP接收端
 * 	实现封装数据包 java.net.DatagramPacket 接收数据
 * 	实现输出传输 java.net.DatagramSocket   接收数据包
 * 
 * 实现步骤:
 * 	1.创建DatagramSocket对象,绑定端口号(和发送端一致)
 * 	2.创建字节数组,接收发来的数据	
 * 	3.创建数据包对象DatagramPacket
 * 	4.调用DategramSocket对象方法
 * 		receive(DatagramPacket dp) 接收数据,数据存放在数据包中
 * 	5.拆包:
 * 		发送的IP地址		数据包对象DatagramPacket方法InetAddress getAddress()
 * 		接收的字节个数	数据包对象DatagramPacket方法int getLength()
 * 		发送方的端口号	数据包对象DatagramPacket方法int getPort()
 * 	6.关闭资源
 */
public class UDPreceive {
	public static void main(String[] args) throws IOException{
		DatagramSocket ds = new DatagramSocket(6000);
		byte[] data = new byte[1024];
		DatagramPacket dp = new DatagramPacket(data, data.length);
		ds.receive(dp);
		//获取发送端端口号
		int port = dp.getPort();
		//获取发送端IP地址
		InetAddress ip = dp.getAddress();
		//获取接收到的字节长度
		int length = dp.getLength();
		System.out.println(port);
		System.out.println(ip);
		System.out.println(new String(data,0,length));
		ds.close();
	}
}
/*
 * 制作无限循环的发送(模拟聊天工具)
 */
public class UDPsend {
	public static void main(String[] args) throws IOException{
		InetAddress inet = InetAddress.getByName("127.0.0.1");
		Scanner sc = new Scanner(System.in);
		DatagramSocket ds = new DatagramSocket();
		while(true) {
			String message = sc.nextLine();
			if(message.equals("我去洗澡了"))
				ds.close();
			byte[] buf = message.getBytes();
			DatagramPacket dp = new DatagramPacket(buf,buf.length,inet,6000);
			ds.send(dp);
		}
		//ds.close();
	}
}
public class UDPreceive {
	public static void main(String[] args) throws IOException{
		DatagramSocket ds = new DatagramSocket(6000);
		byte[] data = new byte[1024];
		DatagramPacket dp = new DatagramPacket(data, data.length);
		while(true) {
			ds.receive(dp);
			int length = dp.getLength();
			String message = new String(data,0,length);
			if(message.equals("我去洗澡了"))
				ds.close();
			int port = dp.getPort();
			InetAddress ip = dp.getAddress();
			
			System.out.println(message+"..."+ip+"..."+port);
		}
		//ds.close();
	}
}

TCP:

 * 实现TCP客户端,连接到服务器

 * 和服务器实现数据交换

 * 实现TCP客户端的类java.net.Socket

 *

 * 构造方法:

 *   Socket(String host,int port)     传递服务器ip和端口号

 *   注意:只要构造方法运行,就会和服务器进行连接,连接失败抛异常

 * OutputStream getOutputStream() 返回套接字的输出流      作用:将数据输出到服务器

 * InputStream getInputStream()  返回套接字的输入流   作用:从服务器读取数据

 

public class TCPClient {
	public static void main(String[] args) throws IOException{
		Socket socket = new Socket("127.0.0.1", 18435);
		OutputStream out = socket.getOutputStream();
		out.write("你好,世界".getBytes());
		
		//接收服务器的消息
		InputStream in = socket.getInputStream();
		byte[] data = new byte[1024];
		int len = in.read(data);
		System.out.println(new String(data,0,len));
		
		socket.close();
	}

 * 实现TCP套接字程序

 * 表示服务器程序的类java.net.ServerSocket

 * 构造方法:

 *          ServerSocket(int port)      传递端口号

 *

 * 获得客户端套接字对象Socket

public class TCPServer {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(18435);
		Socket socket = server.accept();
		InputStream in = socket.getInputStream();
		byte[] data = new byte[1024];
		int len = in.read(data);
		//不能用循环,len不会=-1   用循环会一直等待客户端写入
		System.out.println(new String(data,0,len));
		//服务器回消息
		OutputStream out = socket.getOutputStream();
		out.write("你好,人类".getBytes());
		
		server.close();
		socket.close();
	}
}  
/**
 * 客户端向服务器上传图片
 */
package tcpDemo2;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",8000);
		OutputStream out = socket.getOutputStream();
		FileInputStream in = new FileInputStream("G:\\java\\a.jpg");
		byte[] data = new byte[1024*8];
		int len = 0;
		while((len = in.read(data)) != -1) {
			out.write(data,0,len);
		}
		socket.shutdownOutput();//告诉服务器已停止写入不要读了,终止序列
		//接收服务器的回复消息
		byte[] b = new byte[1024];
		int length = socket.getInputStream().read(b);
		System.out.println(new String(b,0,length));
		socket.close();
		in.close();
	}
}

* 1.ServerSocket套接字对象监听接口8000

 * 2.方法accept() 获取客户端连接对象

 * 3.客户端连接对象获取字节输入流,读取客户端发送的图片

 * 4.创建File文件,绑定上传文件夹(判断文件夹是否存在,不存在就创建)

 * 5.创建字节输出流文件File对象在文件夹中

 * 6.字节流读取图片,字节流将图片写入目的的文件夹中

 * 7.将上传成功发送给客户端

 * 8.关闭资源

 

public class TCPServer {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8000);
		Socket socket = server.accept();
		InputStream in = socket.getInputStream();
		File upload = new File("G:\\net");
		if(!upload.exists())
			upload.mkdirs();
		//防止重名,定义命名规则
		String FileName = "cdd"+System.currentTimeMillis()+".jpg";
		FileOutputStream out = new FileOutputStream(upload+File.separator+FileName);
		byte[] data = new byte[1024];
		int len = 0;
		while((len = in.read(data)) != -1) {
			out.write(data,0,len);
		}
		//服务器回复
		socket.getOutputStream().write("上传成功".getBytes());
		server.close();
		out.close();
		
	}
}

**********************************************************************
/**
 * 
 */
package tcpThread;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;


public class TCPClient {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",8000);
		OutputStream out = socket.getOutputStream();
		FileInputStream in = new FileInputStream("G:\\java\\a.jpg");
		byte[] data = new byte[1024*8];
		int len = 0;
		while((len = in.read(data)) != -1) {
			out.write(data,0,len);
		}
		socket.shutdownOutput();//告诉服务器已停止写入不要读了,终止序列
		//接收服务器的回复消息
		byte[] b = new byte[1024];
		int length = socket.getInputStream().read(b);
		System.out.println(new String(b,0,length));
		socket.close();
		in.close();
	}
}

/**
 * 
 */
package tcpThread;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;

/*
 * 建立服务器线程
 * 	连接一个客户端建立一个服务器线程
 * 	此线程接收socket套接字
 */
public class UpLoad implements Runnable{
	private Socket socket;
	public UpLoad(Socket socket) {
		this.socket = socket;
	}
	public void run() {
		try {
		InputStream in = socket.getInputStream();
		File upload = new File("G:\\net");
		if(!upload.exists())
			upload.mkdirs();
		//防止重名,定义命名规则
		String FileName = "cdd"+System.currentTimeMillis()+".jpg";
		FileOutputStream out = new FileOutputStream(upload+File.separator+FileName);
		byte[] data = new byte[1024];
		int len = 0;
		while((len = in.read(data)) != -1) {
			out.write(data,0,len);
		}
		//服务器回复
		socket.getOutputStream().write("上传成功".getBytes());
		out.close();
		socket.close();
		}catch(Exception e) {
			
		}
	}

}
package tcpThread;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPThreadServer {
	public static void main(String[] args) throws IOException{
		ServerSocket server = new ServerSocket(8000);
		while(true) {
		Socket socket = server.accept();
		Thread t = new Thread(new UpLoad(socket));
		t.start();
		}
	}
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值