黑马程序员_网络编程小结

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

总结:发生数据之前需要先有个目的(UDP),或者先建立平台(TCP)

UDP:面向无连接,所以先启动服务端还是客户端无所谓

--------------------------UDP发送端----------------------------------------

// 创建UDP服务
		DatagramSocket ds = new DatagramSocket(8000);
		while (true) {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));

			byte[] data = br.readLine().getBytes();
//打包数据(包含目的地)
			DatagramPacket p = new DatagramPacket(data, data.length,
					InetAddress.getByName("27.151.71.184"), 10000);
			ds.send(p);//发送



--------------------------UDP接收端----------------------------------------

//接收端:// 创建UDP服务
DatagramSocket socket = new DatagramSocket(10000);
		while (true) {
			byte[] buf = new byte[1024];
//创建存储的包裹
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			// 等待接受数据
			socket.receive(packet);
			// 已接受到数据
			String ip = packet.getAddress().getHostAddress();
			String data = new String(packet.getData(), 0, packet.getLength());
			int port = packet.getPort();
			System.out.println(ip + " " + data + " " + port);
		}

注意:DatagramPacket构造中有含地址为发送时的包裹


TCP:需要先启动服务端

--------------------------TCP服务端----------------------------------------
ServerSocket server = new ServerSocket(10000);
		System.out.println("等待客户端连接...");
		Socket client = server.accept();

		PrintStream ps = new PrintStream(client.getOutputStream(),true);

		while (true) {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					client.getInputStream()));
			String ip=client.getInetAddress().getHostAddress();
			System.out.println("等待"+ip+"传输数据...");
			String originData = br.readLine();//readLine这个方法已/r/n结束,所以传入的数据必须包含
			if("over".equals(originData))
				break;
			String newData = originData.toUpperCase();
			ps.println(newData);
		}
		client.close();
		server.close();



--------------------------TCP客户端----------------------------------------

Socket client = new Socket(InetAddress.getByName("110.84.200.94"),
				10000);
		BufferedReader input = new BufferedReader(new InputStreamReader(
				client.getInputStream()));
		PrintStream ps = new PrintStream(client.getOutputStream(),true);
		BufferedReader output = new BufferedReader(new InputStreamReader(
				System.in));
		while (true) {
			System.out.println("等待输入...");
			ps.println(output.readLine());
			String res = input.readLine();
			if (res != null) {
				System.out.println(res);
				continue;
			}
			break;

		}
		client.close();


--------------------------TCP文件上传服务端----------------------------------------

public class Server {

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

		ServerSocket server = new ServerSocket(10000);
		while (true) {
			System.out.println("等待客户端连接...");
			Socket client = server.accept();
			new Thread(new Service(client)).start();
			Thread.sleep(200);//为了控制台显示方便

		}

	}

	private static final class Service implements Runnable {
		private Socket client;
		private String ip;

		public Service(Socket client) {
			this.client = client;
		}

		@Override
		public void run() {
			try {
				//以ip为文件名
				ip = client.getInetAddress().getHostAddress();
				System.out.println(ip+":正在上传文件");
				InputStream fis = client.getInputStream();
				File file = new File("D:\\TCP", ip+".jpg");
				file.getParentFile().mkdir();
				file.createNewFile();
				
				FileOutputStream fos = new FileOutputStream(file);
				PrintStream ps = new PrintStream(client.getOutputStream());
				int len = 0;
				byte[] buf = new byte[1024];
				while ((len = fis.read(buf)) != -1) {
					fos.write(buf, 0, len);
					fos.flush();
				}
				ps.println("文件上传完毕");
				fos.close();
			} catch (Exception e) {
				throw new RuntimeException(ip + ":上传文件失败:"+e.getMessage());
			}

		}
	}

}

--------------------------TCP文件上传客户端端----------------------------------------

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

		Socket client = new Socket(InetAddress.getByName("110.84.200.94"),
				10000);
		FileInputStream fis = new FileInputStream(new File("C:\\1.jpg"));
		OutputStream os = client.getOutputStream();

		int len = 0;
		byte[] buf = new byte[1024];
		while ((len = fis.read(buf)) != -1) {
			os.write(buf, 0, len);
			os.flush();
		}
		client.shutdownOutput();// 标记输出流操作完毕,不然服务端还会一直读,报 Connection reset异常
		String res = new BufferedReader(new InputStreamReader(
				client.getInputStream())).readLine();
		System.out.println(res);
		client.close();

	}
}

注意:

client.shutdownOutput();// 标记输出流操作完毕,不然服务端还会一直读,报 Connection reset异常
		

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值