java中如何实现多个客户端与服务器连接
服务器端可以采用多线程处理客户请求,例如:
package threadPool;
import javaioBufferedReader;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javaioOutputStream;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
import javautilconcurrentExecutorService;
import javautilconcurrentExecutors;
public class ThreadPoolServer {
private int port = 8000;
private ServerSocket serverSocket;
private ExecutorService executorService; //线程池
private final int POOL_SIZE = 4; //单个CPU时线程池中的工作线程数目
public ThreadPoolServer() throws IOException{
serverSocket = new ServerSocket(port);
//创建线程池
//Runtime 的availableProcessors()方法返回当前系统CPU的数目
//系统CPU越多,线程池中的工作线程数目越多
executorService = ExecutorsnewFixedThreadPool(RuntimegetRuntime()availableProcessors()POOL_SIZE);
Systemoutprintln("服务器已启动!!");
}
public void service(){
while(true){
Socket socket = null;
try{
socket = serverSocketaccept();
executorServiceexecute(new Handler(socket));
}catch(IOException e){
eprintStackTrace();
}
}
}
public static void main(String[] args) {
try {
new ThreadPoolServer()service();
} catch (IOException e) {
eprintStackTrace();
}
}
}
class Handler implements Runnable {
private Socket socket;
public Handler(Socket socket) {
thissocket = socket;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socketgetOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socketgetInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg) {
return "echo:" + msg;
}
@Override
public void run() {
try {
Systemoutprintln("New connection accepted:" + socketgetInetAddress() + ":" + socketgetPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = brreadLine()) != null) {
Systemoutprintln(msg);
pwprintln(echo(msg));
if (msgequals("bye")) {
break;
}
}
} catch (IOException e) {
eprintStackTrace();
} finally {
try {
if (socket != null)
socketclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
只要配置你的TNSNAMESORA文件中的脚本即可。
C:\oracle\ora92\network\admin 这个目录下
比如
a1=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 19216821)(PORT = 1521))
)
(CONNECT_DATA =
(SID = a1)
)
)
b1=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =19216822)(PORT = 1521))
)
(CONNECT_DATA =
(SID = b1)
)
)
c1=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 19216823)(PORT = 1525))
)
(CONNECT_DATA =
(SID = c1)
)
)
首先需要解决你IP地址的问题。如果你是外部要访问的话,必须将你安装FTP服务器的IP地址设为路由器的DMZ主机(如:DMZ主机
在某些特殊情况下,需要让局域网中的一台计算机完全暴露给广域网,以实现双向通信,此时可以把该计算机设置为DMZ主机。
( 注意:设置DMZ主机之后,与该IP相关的防火墙设置将不起作用。)
DMZ主机IP地址: 1921681 启用
)
然后通过路由器管理工具找到你拨号的时自动生成的IP地址,这时候你的机器就拥有真正的互联网地址了(
WAN口状态
MAC 地址: 00-14-78-C0-00-05
IP地址: 59173213134 PPPoE
子网掩码: 255000
网关: 59173213134
DNS 服务器: 2021032468, 2021030117
)
注意:由于是拨号,你的IP可能会随着拨号而变化。
然后安装SERV-U就可以了(在关内容请看下一贴)
以上工作完毕之后可以如此访问你的FTP: ftp 59173213134(假设这个IP是你PPOE拨号的IP地址)
参考上一个方法。
一个客户端,我可以简单的理解成一个进程。
一个进程可以很多个 SOCKET。
一个SOCKET 可以连接一个服务器,建立一个连接。
新手,建议就用CSocket吧, 针对每个服务器实例化一个对象。
至于SOCKET模型,不急,等基本的会了,再深入。
\oracle\product\1020\db_1\NETWORK\ADMIN\tnsnamesora中直接添加配置来完成,或者通过命令:开始--运行--cmd---netca,弹出的窗口中选择本地net服务名配置,按照提示配置就OK方法有很多种
0条评论