用java的Socket编写的小小小聊天工具,在本机调试成功,但是在两台能互相ping通的电脑却不能连接上

用java的Socket编写的小小小聊天工具,在本机调试成功,但是在两台能互相ping通的电脑却不能连接上,第1张

建议先用一个最简单的程序测试客户端链接服务器,这样可以排除很多干扰,下面两个类已经是客户端和服务器的最简代码了,你先测一下,如果仍不能连接,把异常信息发上来看看。
另:Socket连接容易出问题的地方:
1)端口号冲突,服务器无法启动;
2)IP地址错误,IP地址分本机地址、局域网地址和广域网地址,在不同的环境下使用不同的地址测试,如果错误将无法被客户端访问,还有如果机器安装了多网卡等问题都会引起错误;
3)防火墙禁止Java程序开放端口,不单是服务器机器的软防火墙,局域网的防火墙也可能阻止外部的访问。
import javaioIOException;
import javanetServerSocket;
import javanetSocket;
public class ServerMain {
public ServerMain() {
try {
ServerSocket ss = new ServerSocket(31647);
Socket s = ssaccept();
Systemoutprintf("客户端连接成功:\n%s\n", stoString());
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
new ServerMain();
}
}
import javaioIOException;
import javanetSocket;
import javanetUnknownHostException;
public class ClientMain {
public ClientMain() {
try {
Socket s = new Socket("1921681100", 31647); // 修改IP地址
Systemoutprintln("连接服务器成功!");
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
public static void main(String[] args) {
new ClientMain();
}
}

网易我的世界启动时要时间所以务必耐心等候,并且不要再次发出启动程序命令。
把所以盘的有关网易我的世界文件夹(MCLauncher;MCLDownload)删掉,再安装。进入服务器的方法
选择相应版本后进入游戏 点击“多人游戏”按钮(即第二个,这里指原版,自定义GUI的请参考“多人游戏”)
点击“添加服务器”后输入对应的IP,点击完成。
刷新一下就能ping到该游戏服务器了~

出现这个问题的原因,就是连接远程服务的网络不通或者是端口有问题导致的。
问题原因排查:
第一步:在黑窗口中输入 :ping ip是否连通;如果没问题进行第二步。
第二步:在黑窗口中输入:telnet ip 端口,查看端口是否可以访问,如果没问题进行第三步。
第三步:在黑窗口输入:ping 地址(此地址就是conn的地址)。
备注:以上三步肯定能够排查出问题原因的。如果还是不行,那么就是代码编写的有问题。

硬件环境:
浪潮NF5280M4
RAID卡 3008 (CTRL+I进入配置)
软件环境:
CentOS-7-x86_64-DVD-2003(原服务器系统)注:不知道代理商用的什么驱动,居然能识别板载RAID卡。
重做系统版本:Centos610
因为系统出故障,打算重装系统,这期间碰到的重装问题进行整理。以供同仁参考。
1BIOS设备BMC静态地址和掩码,网关可以不设置(F2进入BIOS);
在这里插入描述
2笔记本与服务器IPMI端口,网线直连;
3笔记本设备和BMC同网段地址;
4windows系统关掉防火墙;
5测试ping 服务器BMC管理地址是否畅通;
6注意使用浏览器谷歌和IE,如果多次打不开BMC地址,修复浏览器清理缓存,或重启服务器和笔记本;
7BMC安装系统有两种方式,HTML5网页版和JAVA版,HTML5需要浏览器支持(BMC下没有HTML5选项的,用JAVA方式),不支持的使用JAVA版安装系统,其他看官方手册安装即可。
在这里插入描述
BMC JAVA方式安装
8d出JAVA程序下载运行,会有安全级别提醒,把“管理地址+端口”添加进例外,修改完后进入正常 *** 作界面。
在这里插入描述
在这里插入描述
在这里插入描述
正常 *** 作界面
9浪潮服务器不管是BMC和U盘镜像重装系统时要注意版本是否和原系统匹配,不然会出现RAID驱动不配套,因为找不到磁盘,会出现下图问题。网上说的其他解决方法都忽略这方面问题,导致我在这个问题打转转。

一、问题说明:
最近测试mongo复制集,由于没有机器,所以选择在一台虚拟机上搭建。然后使用mongo-java-driver连接。
①、复制集初始化函数如下:
>
config = {_id: 'shard1', members: [{_id: 0, host:
'127001:20011'},{_id: 1, host: '127001:20012'},{_id: 2,
host:'127001:20013'}]}
> rsinitiate(config)
或者你换成localhost,都没有关系。
②、java连接代码如下:
static Mongo m = null;
static{
try {
List<ServerAddress> list= new ArrayList<ServerAddress>();
ServerAddress sap0 = new ServerAddress("192168132100",20011);
ServerAddress sas1 = new ServerAddress("192168132100",20012);
ServerAddress sas2 = new ServerAddress("192168132100",20013);
listadd(sap0);
listadd(sas1);
listadd(sas2);
m = new Mongo(list);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
192168132100是虚拟机的IP,并不是使用本地localhost或者127001,因为程序不再虚拟机上么。
报错:
Exception in thread "main" commongodbMongoException: can't find a master
原因分析:
m = new Mongo(list);
使用此方法:
public Mongo( List<ServerAddress> replicaSetSeeds , MongoOptions options )
throws MongoException {

_addrs = replicaSetSeeds;

_connector = new DBTCPConnector( this , _addrs );
_connectorstart();

}
数据库连接是DBTCPConnector的实体类。
public DBTCPConnector( Mongo m , List<ServerAddress> all )
throws MongoException {
_portHolder = new DBPortPoolHolder( m_options );
_checkAddress( all );
_allHosts = new ArrayList<ServerAddress>( all );
_rsStatus = new ReplicaSetStatus( m, _allHosts );
_createLoggerinfo( all " -> " getAddress() );
}
错误报错是找不到主,我们关注ReplicaSetStatus类,继续往下走:
这个类是获取replica set 最新状态的,运行时,后台有一个线程ping服务器,所以这个类的状态都是最新的。他会读取rs的初始化函数,得到host,主从等等状态信息。
初始化函数:
ReplicaSetStatus( Mongo mongo, List<ServerAddress> initial ){
_all = CollectionssynchronizedList( new ArrayList<Node>() );
for ( ServerAddress addr : initial ){
_alladd( new Node( addr ) );
}

_updater = new Updater();
}
可以看到还有一个Node类,这个类是个内部类,保存address的名称,端口等信息。
Updater即是后台进程,同样是个内部类,继承Thead类:
class Updater extends Thread {
Updater(){
super( "ReplicaSetStatus:Updater" );
setDaemon( true );
}
public void run(){
while ( ! _closed ){
try {
updateAll();
long now = SystemcurrentTimeMillis();
if (inetAddrCacheMS > 0 && _nextResolveTime < now) {
_nextResolveTime = now inetAddrCacheMS;
for (Node node : _all) {
nodeupdateAddr();
}
}
// force check on master
// otherwise master change may go unnoticed for a while if no write concern
_mongogetConnector()checkMaster(true, false);
}
catch ( Exception e ){
_loggerlog( LevelWARNING , "couldn't do update pass" , e );
}
try {
Threadsleep( updaterIntervalMS );
}
catch ( InterruptedException ie ){
}
}
}
}
当_connectorstart();执行时,就会启动这个线程。关注绿色代码部分,updateAll()函数
synchronized void updateAll(){
HashSet<Node> seenNodes = new HashSet<Node>();
for ( int i=0; i<_allsize(); i++ ){
Node n = _allget(i);
nupdate(seenNodes);
}

}
nupdate(seenNodes),继续。。
synchronized void update(Set<Node> seenNodes){
try {
long start = SystemcurrentTimeMillis();
CommandResult res = _portrunCommand( _mongogetDB("admin") , _isMasterCmd );

}
可以看到程序会远程执行isMaster命令,得到res
{
"serverUsed" : "19216872128:20011" , "setName" : "rstest" ,
"ismaster" : false , "secondary" : true , "hosts" : [ "localhost:20011" ,
"localhost:20013" , "localhost:20012"] , "primary" : "localhost:20012" ,
"me" : "localhost:20011" , "maxBsonObjectSize" : 16777216 , "ok" : 10}
这样的信息,看到了吧,hosts里面显示的是localhost:20011,就是我们在config函数里配置的IP
然后后面的程序会更新Node,将host变为localhost:20011,这样,我们的程序就无法连接了,毕竟不是在本地配置的。
其实这是个特例了,如果你的程序和mongo在一起的话,这样配置也不会出错,如果程序和mongo不在一起,那么你就需要用外部IP配置复制集了。解决办法如下:
>
config = {_id: 'shard1', members: [{_id: 0, host:
'192168132100:20011'},{_id: 1, host: '192168132100:20012'},{_id:
2, host:'192168132100:20013'}]}
> rsinitiate(config)

根据情况有2种原因,:
1、网络问题,ping命令走的icmp协议,测试网络端口的连通性是错误的,请使用telnet命令来测试目的主机的的ssh端口是否有效;
2、ssh的server端配置问题,请查看ssh是否允许密码登录,还是更安全的秘钥文件登录。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13438623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-06
下一篇 2023-08-06

发表评论

登录后才能评论

评论列表(0条)

保存