在java中通过socket进行交互的过程中主要用到Socket和ServerSocket两个类,ServerSocket可以监听指定的服务器端口而Socket则用于和连接的对方进行对话。基本的socket有客户端和服务器端两个部分。由服务器端通过ServerSocket类不断监听本地端口,当接收到客户端的连接请求后将Socket的输入、输出重定义到Network Stream流,这样我们就可以利用BufferedReader类和PrintWriter类实现以out.println()或in.readLine()等形式从socket中获取或发送数据。最简单的socket程序如下
import java.io.*;
import java.net.*;
public final class Client {
//客户端
public Client() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
/*if(args.length !=1)
{
System.out.println("格式:java client servername");
return;
}
String SvrName =args[0];*/
Socket connection;
//向指定ip和端口发送连接请求
connection = new Socket("192.168.23.46",1414);
//将socket进行重定向,方便以out.println和in.readLine的形式获取和发送数据
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
PrintWriter out=new PrintWriter(connection.getOutputStream(),true);
String info;
//读取服务器端传来的数据并显示
info = in.readLine();
System.out.println(info);
connection.close();
}
catch(Exception e)
{
System.out.println("访问异常!");
}
}
}
import java.net.*;
import java.io.*;
public class Server {
//服务器端
/**
* @param args
*/
ServerSocket server;
Socket socket;
public static void main(String[] args) {
// TODO Auto-generated method stub
Server TempServer=new Server();
}
public Server()
{
try
{
//监听1414端口
server=new ServerSocket(1414);
System.out.println("Socket监听服务已启动。");
System.out.println("等待客户端请求。");
//等待客户端连接
socket = server.accept();
System.out.println("连接成功。");
//将socket进行重定向,方便以out.println和in.readLine的形式获取和发送数据
BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
//发送数据
out.println("来自监听服务器的问候:您好!");
out.close();
in.close();
server.close();
}
catch(Exception e)
{
System.out.println(e.toString());
System.exit(1);
}
}
}
以上只是最基本的运用socket进行的通信程序,但是仅能实现服务器和单个客户端通信。要实现服务器和多个客户端通信还需要运用到多线程。java中实现多线程的一种方式是继承Thread类(由于每个子类只能有一个父类,因此在特定环境下该方法并不适用,此时是通过Runnable接口进行实现,这里不多讨论)。实现方式如下
import java.lang.*;
class MyThread extends Thread
{
long Temp;
myThread(long Temp)
{
this.Temp=Temp;
}
public void(run)
{
//独立线程的相关操作
}
}
当使用该线程是只需执行如下语句:
myThread p=new myThread(0);
p.start();
实现服务器和多个客户端通信的的思想是主程序中通过死循环对端口进行持续监听,每一个用户通过子线程进行通信。同时还可以运用回调函数在字线程中将用户id之类的信息反馈给主程序。