您的位置:首页 > 其它

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

2017-04-09 22:58 399 查看

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,就可以实现服务端与客户端的一来一去对讲功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐