网络编程之TCP协议

概念性的东西上一篇文章已经介绍了,下面直接通过两个例子来演示。


客户端(发送数据和接收服务端的数据):必须先启动服务器

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientDemo {

	public ClientDemo() {

	}

	public static void main(String[] args) {

		try {
			Socket socket = new Socket("127.0.0.1", 8888); // 指定要访问的ip和端口号
			// 通过reader来读取数据
			BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// 通过writer来向服务端发送数据
			PrintStream writer = new PrintStream(socket.getOutputStream());

			System.out.println(reader.readLine()); // 读取服务数据
			writer.println("我想咨询一下"); // 向服务写入数据
			socket.close(); // 关闭socket,最好在finally中关闭
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

		}
	}
}

服务器端(发送数据和接收服务端的数据)

package Socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceDemo {

	public ServiceDemo() {

	}

	public static void main(String[] args) {
		new Thread() {
			public void run() {

				try {
					final ServerSocket socket = new ServerSocket(8888);// 指定端口号
					while (true) { // 不断接受客户端请求 因为有多个客户端 ,需要请求 只有一个服务器端
						Socket accept = socket.accept(); // 接受客户端的请求
						BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream())); // 获取客户端输入流
						PrintStream ps = new PrintStream(accept.getOutputStream());// 获取客户端输出流
						ps.println("可以啊");
						System.out.println(br.readLine());
						// socket.close();
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			};

		}.start();

	}

}


控制台:


例子二:向服务端传文件:

服务端:

package Socket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {

	public static void main(String[] args) {
		/**
		 * 先从客户端发文件名到服务端,服务端判断是否有该文件 没有的话服务端通知客户端,可以上传文件了,客户端上传文件,服务端接收文件。
		 */
		new Thread() {
			public void run() {
				try {
					ServerSocket sockets = new ServerSocket(12345);
					Socket socket = sockets.accept();
					InputStream is = socket.getInputStream();
					BufferedReader bf = new BufferedReader(new InputStreamReader(is));
					PrintStream ps = new PrintStream(socket.getOutputStream());
					String name = bf.readLine();
					// 创建文件夹 封装成file对象,判断存在
					// 判断文件是否存在,存在就退出
					File f = new File("update");
					f.mkdir();
					File file = new File(f, name);
					if (file.exists()) {
						ps.println("存在");
						socket.close();
						return;

					} else {

						ps.print("不存在");
					}

					// 从网络读取数据 存储到本地
					FileOutputStream fis = new FileOutputStream(file);
					int len = 0;
					byte[] b = new byte[1024];
					while ((len = is.read(b)) != 1) {
						fis.write(b, 0, len);
					}
					fis.close();
					socket.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			};

		}.start();

	}

}

客户端:

package Socket;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class FileClient {

	public static void main(String[] args) {
		// 获取文件的路径 验证是否是文件夹 和文件是否存在
		File file = getFile();
		// 发送文件名到服务器
		try {
			Socket socket = new Socket("127.0.0.1", 12345);
			BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintStream ps = new PrintStream(socket.getOutputStream());
			ps.println(file.getName());
			// 接收结果 如果文件存在则 直接退出 否则 发文件到服务器
			String result = bf.readLine();
			if (result.equals("存在")) {
				System.out.println("您上传的文件存在 ,请不要重复上传");
				socket.close();
				return;
			}
			//发送文件到服务器
			FileInputStream fis = new FileInputStream(file);
			byte[] b = new byte[8888];
			int len;
			while ((len = fis.read(b)) != -1) {
				ps.write(b, 0, len);

			}
			ps.close();
			fis.close();

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private static File getFile() {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个文件路径:");
		while (true) {
			String str = input.nextLine();
			File f = new File(str);
			if (!f.exists()) {
				System.out.println("您输入的文件路径不存在");

			} else if (f.isDirectory()) {

				System.out.println("你输入的是文件夹路径");
			} else {

				return f;
			}

		}

	}

}





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
网络聊天是一种基于计算机网络的通信方式,它允许用户在不同的计算机上进行实时的文字或多媒体的交流。计算机网络课设中基于TCP协议编程的网络聊天系统可以通过以下步骤来实现: 1. TCP连接的建立:使用Socket API来建立一个TCP连接,其中一个计算机作为服务器,另一个作为客户端。 2. 用户注册和登陆:在服务器端实现一个用户管理系统,其中包括用户的注册和登录功能。用户可以输入用户名和密码进行注册或登录验证。 3. 聊天室的创建和加入:将服务器端的聊天室实现为一个多线程的程序,每当一个用户想要加入聊天室时,服务器为该用户创建一个新的线程,用于处理该用户的消息。 4. 消息的发送和接收:在聊天室中,每个用户都可以发送消息给其他用户,并接收其他用户的消息。消息通过Socket连接发送到服务器,在服务器端再将消息转发给所有在线的用户。 5. 界面设计:在客户端实现一个用户界面,用于显示聊天室中的消息,并提供发送消息的功能。用户可以使用命令或者图形界面与聊天室进行交互。 6. 错误处理和异常处理:在编程中,需要考虑到可能出现的各种异常情况,如网络连接中断、输入错误等,需要相应地处理和提示用户。 7. 数据加密和安全性:为了保护用户的隐私和数据安全,可以使用加密技术对数据进行加密,确保数据在传输过程中不被窃取或篡改。 通过以上步骤,基于TCP协议编程的网络聊天系统可以实现用户注册、登录、聊天室的创建和加入、消息的发送和接收等功能。同时需要考虑到确保系统的稳定性、安全性和用户友好性,提供良好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值