Java 服务器与客户端的简单连接
今天刚学了一点socket,加上老师的帮助,写了一个服务器与客户端的简单连接
利用的主要就是socket建立连接,发送数据
以下几个方法要注意:
- Socket(InetAddress address, int port); //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。(本篇采用这个方法)
- Socket(String host, int port); //创建一个流套接字并将其连接到指定主机上的指定端口号。
- getInputStream(); // 获得网络输入流
- getOutputStream(); // 获得网络输出流
- close(); // 关闭Socket连接
再来,要明白一些原理性的问题:即 对于客户端和服务器而言,输入流或输出流是相对的
直接上图:
好了,介绍完这些,就可以先写客户端了。
ps:因为服务器端涉及到专门的ServerSocket类,所以后面再说,二者是相通的,写完一个,另一个水到渠成
因为服务器客户端分开运行,涉及到两个线程的问题
所以先建立一个ClientThread类,实现implements接口,重写run方法即可
package Chap2;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class ClientThread implements Runnable {
@Override
public void run() {
try {
while(true) {
Scanner s=new Scanner(System.in);
//output
String temp = s.nextLine();
Socket socket = new Socket("127.0.0.1", 8886);
OutputStream os = socket.getOutputStream();
os.write(temp.getBytes());
os.flush();
//input
InputStream is = socket.getInputStream();
byte[] cache=new byte[1024];
is.read(cache);
System.out.println("The client has received the data :"+new String(cache));
os.close();
socket.close();
if(temp.equals("end"))
break;
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
客户端完成
接下来简单介绍一下用于编写服务器端的ServerSocket类
ServerSocket类:服务器端套接字类。监听服务器指定端口,接收客户端连接请求
注意一下几种方法:
- ServerSocket(int port)
- accept(); // 用于产生“阻塞”,直到接收一个连接,返回客户端Socket对象,这个是关键,即服务器需要等待用户信息
- close(); // 关闭服务器端Socket监听
package Chap2;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerThread implements Runnable {
@Override
public void run() {
try {
while (true) {
//input
Scanner s = new Scanner(System.in);
ServerSocket serverSocket = new ServerSocket(8886);
System.out.println("server is listening……");
Socket socket = serverSocket.accept();
System.out.println("It's blocked just now.");
InputStream is = socket.getInputStream();
byte[] cache = new byte[1024];
is.read(cache);
System.out.println("The server has recevied the data:" + new String(cache));
//output
OutputStream os = socket.getOutputStream();
System.out.println("The server will respond to the client:");
String temp = s.nextLine();
os.write(temp.getBytes());
if (temp.equals("end"))
break;
os.flush();
is.close();
os.close();
serverSocket.close();//如果不进行close操作,地址一直被占用控制台报错: Address already in use: JVM_Bind
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端,服务器端已经编写完毕,现在需要两个main方法来开辟两个线程并执行
package Chap2;
public class ServerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new ServerThread()).start();
}
}
package Chap2;
public class ClientTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new ClientThread()).start();
}
}
运行后效果: