通信过程
服务器端:
1、 创建 ServerSocket 对象(并绑定端口)
2、 调用 accept 方法,等待来自客户端的连接
3、 调用 getXXXStream 方法,进行 I/O
4、 关闭 Socket
客户端:
1、 创建 Socket 对象,并连接服务器
2、 调用 getXXXStream 方法,进行 I/O
3、 关闭 Socket
例子:客户端向服务器端发送一个“hello”字符串。服务端接受客户端发送的字符串,在后面增加一个“ from server”字符串,再返回给客户端。
服务器端代码:
服务器端的步骤
创建 ServerSocket 对象(并绑定端口)
while(true){
调用 accept 方法
调用 getXXXStream 方法,进行 I/O
关闭 Socket
}
利用多线程可以实现多用户访问,当一个用户来,就开一个线程给他,不影响多用户同时访问的情况,如果不用多线程的话只能是一个客户端访问,别的客户端要访问的话只能等。
package chp17;
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//创建 ServerSocket 对象(并绑定端口)
ServerSocket ss = new ServerSocket(9000);
while(true){
//调用 accept 方法
Socket s = ss.accept();
//创建新线程进行 I/O
Thread t = new ServerThread(s);
t.start();
}
}
}
class ServerThread extends Thread{
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
public void run(){
try{
BufferedReader br =
new BufferedReader(
new InputStreamReader(s.getInputStream())
);
String line = br.readLine();
PrintWriter pw = new PrintWriter(
s.getOutputStream());
pw.println(line + " from server");
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码:
package chp17;
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//创建 Socket 对象(并连接服务器)
Socket s = new Socket("10.249.151.86", 9000);
//调用 getXXXStream 方法,进行 I/O
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println("hello world");
pw.flush();
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream())
);
String line = br.readLine();
System.out.println(line);
//关闭 Socket
s.close();
}
}