用ServerSocket类与Socket类实现客户端与服务端的交互

ServerSocket类,此类实现服务端的套接字,Socket类,此类实现客户端的套接字,而套接字就是两台机器间通信的端点,所以就用ServerSocket类和Socket类实现客户端与服务端的交互,下面先来查看ServerSocket类的api

看到构造方法,首先想到要使用要先new一个,然后方法里可以绑定dao特定端口,这里以端口8888为例,创建一个服务端监听8888端口,然后获取连接着的ip地址,输出连接的地址,代码如下

	public static void test1() {
		try {
			ServerSocket ss = new ServerSocket(8888);
			Socket sk = ss.accept();
			//获取连接的ip地址	
			System.out.println(sk.getInetAddress());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
可以通过电脑自带的命令提示符使用telnet命令连接测试,命令telnet加上ip加上端口号就可以连接了


上面通过使用ServerSocket返回一个Socket,然后我们通过查看Socket的api看到可以获取一个输入流,然后用Scanner包装,获取我们输入的内容,然后用while循环,然后在控制台输出内容

public static void test2() {
		try {
			System.out.println("服务已启动");
			ServerSocket ss = new ServerSocket(8888);
			Socket s = ss.accept();
			System.out.println(s.getInetAddress());
			InputStream is = s.getInputStream();
			Scanner sc = new Scanner(is);
			while (sc.hasNextLine()) {
				String str = sc.nextLine();
				System.out.println(str);
			}
			s.close();
			is.close();
			sc.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
然后还是跟上个方法一样,连接上服务端,输入telnet ip地址 端口然后回车
会出现如下黑色界面,按“ctrl+]”


会出现如下界面,继续按回车

然后出现如下界面,我们输入的内容才能在命令提示符里显示出来


上面的代码方法使我们能在服务端发消息给客户端,而客户端不能发消息给服务端,下面介绍客户端能发消息给服务端,服务端不能发消息给客户端,我们new一个ServerSocket,然后监听8888端口,然后用Socket获取一个输出流(把我们在控制台写的内容输出到服务端),然后new一个scanner来包装System.in(获取键盘的输入流),然后把键盘的输入流输出到客户端

	public static void test3() {
		try {
			System.out.println("服务启动");
			ServerSocket ss = new ServerSocket(8888);
			Socket socket = ss.accept();
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			Scanner sc = new Scanner(System.in);
			while(sc.hasNextLine()){
				String str = sc.nextLine();
				pw.println(str);
				pw.flush();
			}
			socket.close();
			sc.close();
			pw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

可以看到只能控制台发送消息,而服务端发送消息无效,接下来介绍在服务端能发送接收消息,客户端也能接收发送消息,新建两个类


在ServerSocket(服务端)里输入以下代码,既获取输入流又获取输出流,然后读取键盘输入的内容

	public static void test1() {
		try {
			ServerSocket ss = new ServerSocket(8888);
			while(true){
				Socket socket = ss.accept();
				Scanner scanner = new Scanner(socket.getInputStream());
				PrintWriter pw = new PrintWriter(socket.getOutputStream());
				while(scanner.hasNextLine()){
					String str = scanner.nextLine();
					System.out.println(str);
					Scanner s = new Scanner(System.in);
					if (s.hasNextLine()) {
						String  msg = s.nextLine();
						pw.println(msg);
						pw.flush();
					}
				}
					socket.close();
					scanner.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
然后在Socket(客户端)里输入以下代码,既获取输入流又获取输出流,然后获取键盘输入的内容

	public static void test1(){
		try {
			Socket socket = new Socket("自己的ip地址xxx.xxx.xxx.xxx", 8888);
			Scanner scanner = new Scanner(socket.getInputStream());
			PrintWriter pw = new PrintWriter(socket.getOutputStream());
			Scanner s = new Scanner(System.in);
			while(s.hasNextLine()){
				String str = s.nextLine();
				if (str.equals("exit")) {
					System.out.println("我要退出了");
					socket.close();
					s.close();
					System.exit(0);
				}
				pw.println(str);
				pw.flush();
				String msg = scanner.nextLine();
				System.out.println(msg);
			}
			s.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

在以上两个类里写好后先启动ServerSocket,然后再启动Socket,就可以实现服务端与客户端的一来一去对讲功能

阅读更多
文章标签: socket telnet 通信
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

用ServerSocket类与Socket类实现客户端与服务端的交互

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭