多线程技术
服务器接收到一个客户的套接字后,就启动一个专门为该客户服务的线程。
例题:客户端输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户端-服务器交互计算来完成任务。
Server.java
package SocketClass.ServerThread;
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
public static void main(String []args){
ServerSocket server = null;
ServerThread thread;
Socket you = null;
while (true){
try{
server = new ServerSocket(956);
}catch (Exception e){
System.out.println("正在监听");//ServerSocket对象不能重复创建
}
try{
System.out.println("等待客户呼叫");
you = server.accept();
System.out.println("客户的地址:"+you.getInetAddress());
}catch (Exception e){
System.out.println("正在等待客户");
}
if(you!=null){
new ServerThread(you).start();//为每个客户启动一个专门的线程
}
}
}
}
class ServerThread extends Thread{
Socket socket;
DataOutputStream out = null;
DataInputStream in = null;
String s = null;
ServerThread(Socket t){
socket = t;
try{
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
}catch (Exception e){
}
}
public void run(){
while (true){
try{
double r =in.readDouble();//堵塞状态,除非读取到信息
double area = Math.PI*r*r;
out.writeDouble(area);
}catch (Exception e){
System.out.println("客户离开");
return;
}
}
}
}
Client.java
package SocketClass.ServerThread;
import java.io.*;
import java.net.*;
import java.util.*;
public class Client {
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
Socket mysocket = null;
DataInputStream in = null;
DataOutputStream out = null;
Thread readData;
Read read = null;
try{
mysocket = new Socket();
read = new Read();
readData = new Thread(read);
System.out.println("输入服务器的IP:");
String IP=scanner.nextLine();
System.out.println("输入端口号:");
int port = scanner.nextInt();
if(mysocket.isConnected()){
}else {
InetAddress address = InetAddress.getByName(IP);
InetSocketAddress socketAddress = new InetSocketAddress(address,port);
mysocket.connect(socketAddress);
in = new DataInputStream(mysocket.getInputStream());
out = new DataOutputStream(mysocket.getOutputStream());
read.setDataInputStream(in);
readData.start();
}
}catch (Exception e){
System.out.println("服务器已断开"+e);
}
System.out.println("输入圆的半径(放弃请输入N):");
while(scanner.hasNext()){
double radius = 0;
try{
radius = scanner.nextDouble();
}catch (Exception e){
System.exit(0);
}
try{
out.writeDouble(radius);
}catch (Exception e){
}
}
}
}
class Read implements Runnable{
DataInputStream in;
public void setDataInputStream(DataInputStream in){
this.in = in;
}
@Override
public void run() {
double result = 0;
while(true){
try{
result = in.readDouble();
System.out.println("圆的面积:"+result);
System.out.println("输入圆的半径(放弃请输入N):");
}catch (Exception e){
System.out.println("与服务器已断开"+e);
break;
}
}
}
}
本程序为了调试方便,在建立套接字连接时,使用的服务器地址是127.0.0.1,如果服务器设置过有效的IP地址,就可以用有效的IP代替程序中的127.0.0.1.