java服务端如何确定请求服务器
‘壹’ java客户端获取服务器的ip
request.getRemoteAddr();
好像是这个方法可以获得远程服务器上的IP
然后使用这个IP,JDBC连接就好了
‘贰’ 自己在java建了服务器别人怎么进来服务器呢
在Java中创建了一个服务器之后,要让其他人能够访问该服务器,通常涉及以下几个步骤:
确保服务器已启动并监听:
使用Java编写的网络服务器,如之前提到的,通常使用ServerSocket来监听特定的端口。例如,ServerSocket serverSocket = new ServerSocket(8080);这行代码将服务器绑定到8080端口上。确保服务器正在运行并且正在监听该端口。告知其他人服务器的地址和端口:
为了让其他人能够连接到你的服务器,你需要告诉他们服务器的IP地址和监听的端口号。例如,如果你的服务器在本地计算机上运行,并且你有一个公共的IP地址(或者你可以通过路由器进行端口转发),其他人就可以使用你的公共IP地址和端口号(如your_public_ip:8080)来尝试连接到你的服务器。处理客户端连接:
在服务器端,你需要使用ServerSocket的accept()方法来等待客户端的连接。当客户端尝试连接时,accept()方法将返回一个Socket对象,你可以使用这个对象与客户端进行通信。确保网络设置允许外部连接:
如果你的服务器运行在一个私有的网络环境中(如家庭网络或公司内部网络),你可能需要配置路由器或防火墙来允许外部连接。这通常涉及到端口转发,即将外部连接转发到你的服务器所在的内部IP地址和端口上。处理客户端请求和响应:
一旦客户端连接上服务器,你就可以通过Socket对象发送和接收数据了。你需要编写代码来处理客户端的请求,并生成适当的响应。测试连接:
在将服务器的地址和端口告诉其他人之前,最好先自己测试一下连接是否正常。你可以使用telnet或其他网络工具来尝试连接到你的服务器,并检查是否能够成功建立连接和发送/接收数据。
‘叁’ 在java后台服务器,如何根据HttpSession获得客户端ip
只能根据用户请求带过来的sessionID所匹配的ip地址 而且只可以通过request获得ip 反正你能得到session 那得到request是一样简单的不是吗
得到request后命令为:
String ip = request.getRemoteAddr();
这个ip字符串就是了
‘肆’ Java中服务器端ServerSocket对象怎么获取服务器端地址和端口号,怎么获取远程请求的
ServerSocket s = new ServerSocket(8888);
while (true) {
// 建立连接
Socket socket = s.accept();
/ /getInetAddress()获取远程ip地址,getPort()远程客户端的断后好
"你好,客户端地址信息: " + socket.getInetAddress() + "\t客户端通信端口号: " + socket.getPort()
‘伍’ java服务器接收客户端请求怎样实现的
服务器端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Socket通讯服务器端
* @author 米强
*
*/
public class ServerMain {
public ServerMain() {
try {
// 构造服务器ServerSocket对象,参数为服务器端开放的端口号
ServerSocket ss = new ServerSocket(30102);
System.out.println("服务器准备就绪!");
// 死循环可以使服务器持续处于接收客户端状态
while(true){
// 该方法使程序阻塞,等待客户端的链接,当监听到客户端的链接,创建一个Socket对象与客户端单独会话
Socket s = ss.accept();
// 为了不影响服务器监听其它客户端,这里开启了一个线程,由线程处理与这个客户端的会话
new ServerThread(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ServerMain();
}
}
/**
* 服务器端与客户端会话的线程
*/
class ServerThread extends Thread {
private Socket s = null;
private BufferedReader read = null;
private PrintStream print = null;
public ServerThread(Socket s) {
this.s = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
read = new BufferedReader(new InputStreamReader(s.getInputStream()));
print = new PrintStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 线程的运行run方法
*/
public void run() {
try {
String message = null;
// 这里循环可以使服务器持续的接收客户端信息。read.readLine()通过输入流读取一段字符串,赋值给message变量,如果message字符串不为“exit”则循环,否则结束循环
while (!(message = read.readLine()).equals("exit")){
// 将字符串前面添加“返回:”,再发回客户端
print.println("返回:" + message);
}
} catch (IOException e) {
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!s.isClosed()){
// 关闭Socket链接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* Socket通讯客户端
* @author 米强
*
*/
public class ClientMain {
public ClientMain() {
try {
// 构造与服务器通讯的Socket对象,参数为服务器IP地址(String)和端口号(int),端口号需要和服务器端开放的端口号对应
Socket s = new Socket("192.168.1.100", 30102);
// 启动一个线程与服务器通讯,并把链接服务器的Socket对象传递过去
new LinkThread(s).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ClientMain();
}
}
/**
* 与服务器通讯的线程
*/
class LinkThread extends Thread {
private Socket s = null;
// 输出流
private PrintStream out = null;
// 缓冲输入流
private BufferedReader in = null;
// 录入文字的Scanner对象
private Scanner scanner = null;
public LinkThread(Socket s) {
// 将Socket对象实例保存在全局变量中,因为run方法中我们还要用它断开链接
this.s = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
out = new PrintStream(s.getOutputStream());
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 线程的运行run方法
*/
public void run() {
// 构造Scanner对象
scanner = new Scanner(System.in);
System.out.println("提示:如果要结束本次会话,请输入“exit”指令!");
try {
// 死循环可以使客户端不断的向服务器发送信息,不用担心循环无法结束,后面的return语句可以结束整个线程。
while(true){
// 提示用户输入文字
System.out.print("请输入:");
// 将用户输入的字符串保存在message变量中
String message = scanner.nextLine();
// 通过输出流发送字符串
out.println(message);
// 清空缓冲,强制输出
out.flush();
// 获取服务器返回的字符串
String str = in.readLine();
// 如果返回的字符串存在
if(str != null){
// 显示在控制台
System.out.println(str);
}else{
// 提示会话结束,并结束线程
System.out.println("本次会话结束!");
return;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!s.isClosed()){
// 关闭Socket链接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}