1. java Socket甯歌佸紓甯稿勭悊
銆銆鍦╦ava缃戠粶缂栫▼Socket閫氫俊涓 閫氬父浼氶亣鍒颁互涓嬪紓甯告儏鍐
銆銆绗 涓寮傚父鏄 BindException:Address already in use: JVM_Bind
銆銆璇ュ紓甯稿彂鐢熷湪鏈嶅姟鍣ㄧ杩涜宯ew ServerSocket(port)锛坧ort鏄涓涓 鐨勬暣鍨嬪硷級鎿嶄綔鏃 寮傚父鐨勫師鍥犳槸浠ヤ负涓巔ort涓鏍风殑涓涓绔鍙e凡缁忚鍚鍔 骞惰繘琛岀洃鍚 姝ゆ椂鐢╪etstat an鍛戒护 鍙浠ョ湅鍒颁竴涓狶istending鐘舵佺殑绔鍙 鍙闇瑕佹壘涓涓娌℃湁琚鍗犵敤鐨勭鍙e氨鑳借В鍐宠ラ棶棰樹簡
銆銆绗 涓寮傚父鏄 ConnectException: Connection refused: connect
銆銆璇ュ紓甯稿彂鐢熷湪瀹㈡埛绔杩涜 new Socket(ip port)鎿嶄綔鏃 璇ュ紓甯稿彂鐢熺殑鍘熷洜鏄鎴栬呭叿鏈塱p鍦板潃鐨勬満鍣ㄤ笉鑳芥壘鍒帮紙涔熷氨鏄璇翠粠褰撳墠鏈哄櫒涓嶅瓨鍦ㄥ埌鎸囧畾ip璺鐢憋級 鎴栬呮槸璇ip瀛樺湪 浣嗘壘涓嶅埌鎸囧畾鐨勭鍙h繘琛岀洃鍚 鍑虹幇璇ラ棶棰 棣栧厛妫鏌ュ㈡埛绔鐨刬p鍜宲ort鏄鍚﹀啓閿 濡傛灉姝g‘鍒欎粠瀹㈡埛绔痯ing涓涓嬫湇鍔″櫒鐪嬫槸鍚﹁兘ping閫 濡傛灉鑳絧ing閫氾紙鏈嶅姟鍣ㄧ鎶妏ing绂佹帀鍒欓渶瑕佸彟澶栫殑鍔炴硶锛 鍒欑湅鍦ㄦ湇鍔″櫒绔鐨勭洃鍚鎸囧畾绔鍙g殑绋嬪簭鏄鍚﹀惎鍔 杩欎釜鑲瀹氳兘瑙e喅杩欎釜闂棰
銆銆绗 涓寮傚父鏄 SocketException: Socket is closed
銆銆璇ュ紓甯稿湪瀹㈡埛绔鍜屾湇鍔″櫒鍧囧彲鑳藉彂鐢 寮傚父鐨勫師鍥犳槸鏈绔涓诲姩鍏抽棴浜嗚繛鎺ュ悗锛堣皟鐢ㄤ簡Socket鐨刢lose鏂规硶锛夊啀瀵圭綉缁滆繛鎺ヨ繘琛岃诲啓鎿嶄綔
銆銆绗 涓寮傚父鏄 SocketException: 锛圕onnection reset鎴栬匔onnect reset by peer:Socket write error锛
銆銆璇ュ紓甯稿湪瀹㈡埛绔鍜屾湇鍔″櫒绔鍧囨湁鍙鑳藉彂鐢 寮曡捣璇ュ紓甯哥殑鍘熷洜鏈変袱涓 绗涓涓灏辨槸濡傛灉涓绔鐨凷ocket琚鍏抽棴锛堟垨涓诲姩鍏抽棴鎴栬呭洜涓哄紓甯搁鍑鸿屽紩璧风殑鍏抽棴锛 鍙︿竴绔浠嶅彂閫佹暟鎹 鍙戦佺殑绗涓涓鏁版嵁鍖呭紩鍙戣ュ紓甯(Connect reset by peer) 鍙︿竴涓鏄涓绔閫鍑 浣嗛鍑烘椂骞舵湭鍏抽棴璇ヨ繛鎺 鍙︿竴绔濡傛灉鍦ㄤ粠杩炴帴涓璇绘暟鎹鍒欐姏鍑鸿ュ紓甯革紙Connection reset锛 绠鍗曠殑璇村氨鏄鐢辫繛鎺ユ柇寮鍚庣殑璇诲拰鍐欐搷浣滃紩璧风殑
銆銆绗 涓寮傚父鏄 SocketException: Broken pipe
銆銆璇ュ紓甯稿湪瀹㈡埛绔鍜屾湇鍔″櫒鍧囨湁鍙鑳藉彂鐢 鍦ㄧ 涓寮傚父鐨勭涓绉嶆儏鍐典腑锛堜篃灏辨槸鎶涘嚭 SocketExcepton:Connect reset by peer:Socket write error鍚庯級 濡傛灉鍐嶇户缁鍐欐暟鎹鍒欐姏鍑鸿ュ紓甯 鍓嶄袱涓寮傚父鐨勮В鍐虫柟娉曟槸棣栧厛纭淇濈▼搴忛鍑哄墠鍏抽棴鎵鏈夌殑缃戠粶杩炴帴 鍏舵℃槸瑕佹娴嬪规柟鐨勫叧闂杩炴帴鎿嶄綔 鍙戠幇瀵规柟鍏抽棴杩炴帴鍚庤嚜宸变篃瑕佸叧闂璇ヨ繛鎺
銆銆浜岋紟缂栧啓缃戠粶绋嬪簭鏃堕渶瑕佹敞鎰忕殑闂棰:
銆銆 鏄瑕佹g‘鍖哄垎闀 鐭杩炴帴 鎵璋撶殑闀胯繛鎺ユ槸鎸囦竴缁忓缓绔嬪氨姘镐箙淇濇寔 鐭杩炴帴鐨勬儏鍐垫槸 鍑嗗囨暟鎹鈥>寤虹珛杩炴帴鈥>鍙戦佹暟鎹鈥>鍏抽棴杩炴帴 寰堝氱殑绋嬪簭鍛樺啓浜嗗氬勾鐨勭綉缁滅▼搴 灞呯劧涓嶇煡閬撲粈涔堟槸闀胯繛鎺 浠涔堟槸鐭杩炴帴
銆銆 鏄瀵归暱杩炴帴鐨勭淮鎶 鎵璋撶淮鎶ゅ寘鎷涓や釜鏂归潰 棣栧厛鏄妫娴嬪规柟鐨勪富鍔ㄦ柇杩烇紙鍗宠皟鐢 Socket鐨刢lose鏂规硶锛 鍏舵℃槸妫娴嬪规柟鐨勫畷鏈 寮傚父閫鍑哄強缃戠粶涓嶉 杩欐槸涓涓鍋ュ.鐨勯氫俊绋嬪簭蹇呴』鍏峰囩殑 妫娴嬪规柟鐨勪富鍔ㄦ柇杩炲緢绠鍗 涓昏佷竴鏂逛富鍔ㄦ柇杩 鍙︿竴鏂瑰傛灉鍦ㄨ繘琛岃绘搷浣 鍒欐ゆ椂鐨勮繑鍥炲煎彧 涓鏃︽娴嬪埌瀵规柟鏂杩 鍒欏簲璇ヤ富鍔ㄥ叧闂鏈绔鐨勮繛鎺ワ紙璋冪敤Socket鐨刢lose鏂规硶锛 鑰屾娴嬪规柟鐨勫畷鏈 寮傚父閫鍑哄強缃戠粶涓嶉 甯哥敤鏂规硶鏄鐢 蹇冭烦 涔熷氨鏄鍙屾柟鍛ㄦ湡鎬х殑鍙戦佹暟鎹缁欏规柟 鍚屾椂涔熶粠瀵规柟鎺ユ敹 蹇冭烦 濡傛灉杩炵画鍑犱釜鍛ㄦ湡閮芥病鏈夋敹鍒板规柟蹇冭烦 鍒欏彲浠ュ垽鏂瀵规柟瀹曟満 寮傚父閫鍑烘垨鑰呯綉缁滀笉閫 姝ゆ椂涔熼渶瑕佷富鍔ㄥ叧闂鏈绔杩炴帴 濡傛灉鏄瀹㈡埛绔鍙鍦ㄥ欢杩熶竴瀹氭椂闂村悗閲嶆柊鍙戣捣杩炴帴 铏界劧Socket鏈変竴涓猭eep alive閫夐」鏉ョ淮鎶よ繛鎺 濡傛灉鐢ㄨラ夐」 涓鑸闇瑕佷袱涓灏忔椂鎵嶈兘鍙戠幇瀵规柟鐨勫畷鏈 寮傚父閫鍑哄強缃戠粶涓嶉
lishixin/Article/program/Java/hx/201311/26630
2. java 网络编程 抛出Socket is closed异常 大虾帮帮忙
额,你给的都是client端。
3. andoid的socket测试为什么出现这个错误:java.net.ConnectException: failed to connect to /192.168.0.8
andoid的socket测试出现这个错误:java.net.ConnectException: failed to connect to /192.168.0.8的原因是因为当时测试人次要比平时多,从而导致服务器出现不稳定;
解决方式:重新换一个服务器;
andoid的socket测试使得服务器的硬件组成较为复杂,对于服务器硬件的维护应由专业人员进行。在维护和保养存储设备时,我们首先应当对其容量进行测试,看是否需要进行扩容等操作。存储容量一定要能满足任务的需求,并留有一定的冗余量。
(3)javasocket重新连接扩展阅读:
andoid的socket测试拆卸和更新服务器设备时,务必让设备处于断电状态并进行接地处理。即便是更换最简单的部件,这些环节也不能省略。对于一些不熟悉的部件,要反复仔细的阅读说明书和参照文件,在没有十足把握的前提下切忌盲目拆解。
对服务器的密码进行更换,密码应有专人管理。选用的密码要有一定的专业性,一定的复杂度,最好是将数字和字母等结合起来,大小写也要融合进去。在日常的检查中,我们要做好登统计,关闭一些不太使用的端口;
定期对服务器进行除尘处理。特别是服务器这种高温高速运行的设备,大量的积尘对设备造成的伤害往往是致命的。除尘工作要科学有序的进行,不能想当然,也不能蛮干。在除尘过程中特别注意对电源系统的保护。
4. 用Java的socket编程实现c/s结构程序
今天太晚了,改天给你做一个,记得提醒我,这个如果只是要个简单的,我半个小时就搞定了
给我个邮箱
现在给贴出我的代码: 整个结构分两个工程
1。服务端工程NioServer.java: 采用nio 方式的异步socket通信,不仅可以实现你的服务器还可以让你多学习一下什么是nio
2。客户端工程UserClient.java: 采用Swing技术画了一个简单的UI界面,比较土,原因是我没那么多时间去设计界面,你需要的话可以自己去修改得漂亮点,相信不难
现在贴工程1:
package com.net;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NioServer {
public static final int SERVERPORT=5555;
public static final String USERNAME="wangrong";
public static final String PASSword="123456";
public static final String ISACK="ACK";
public static final String ISNAK="NAK!";
// Selector selector;//选择器
// SelectionKey key;//key。 一个key代表一个Selector 在NIO通道上的注册,类似主键;
// //取得这个Key后就可以对Selector在通道上进行操作
private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );// 通道数据缓冲区
public NioServer(){
}
public static void main(String[] args) throws IOException {
NioServer ns=new NioServer();
ns.BuildNioServer();
}
public void BuildNioServer() throws IOException{
/////////////////////////////////////////////////////////
///////先对服务端的ServerSocket进行注册,注册到Selector ////
/////////////////////////////////////////////////////////
ServerSocketChannel ssc = ServerSocketChannel.open();//新建NIO通道
ssc.configureBlocking( false );//使通道为非阻塞
ServerSocket ss = ssc.socket();//创建基于NIO通道的socket连接
//新建socket通道的端口
ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT));
Selector selector=Selector.open();//获取一个选择器
//将NIO通道选绑定到择器,当然绑定后分配的主键为skey
SelectionKey skey = ssc.register( selector, SelectionKey.OP_ACCEPT );
////////////////////////////////////////////////////////////////////
//// 接收客户端的连接Socket,并将此Socket也接连注册到Selector ////
///////////////////////////////////////////////////////////////////
while(true){
int num = selector.select();//获取通道内是否有选择器的关心事件
if(num<1){continue; }
Set selectedKeys = selector.selectedKeys();//获取通道内关心事件的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {//遍历每个事件
try{
SelectionKey key = (SelectionKey)it.next();
//有一个新联接接入事件,服务端事件
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {
// 接收这个新连接
ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();
//从serverSocketChannel中创建出与客户端的连接socketChannel
SocketChannel sc = serverChanel.accept();
sc.configureBlocking( false );
// Add the new connection to the selector
// 把新连接注册到选择器
SelectionKey newKey = sc.register( selector,
SelectionKey.OP_READ );
it.remove();
System.out.println( "Got connection from "+sc );
}else
//读客户端数据的事件,此时有客户端发数据过来,客户端事件
if((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ){
// 读取数据
SocketChannel sc = (SocketChannel)key.channel();
int bytesEchoed = 0;
while((bytesEchoed = sc.read(echoBuffer))> 0){
System.out.println("bytesEchoed:"+bytesEchoed);
}
echoBuffer.flip();
System.out.println("limet:"+echoBuffer.limit());
byte [] content = new byte[echoBuffer.limit()];
echoBuffer.get(content);
String result=new String(content);
doPost(result,sc);
echoBuffer.clear();
it.remove();
}
}catch(Exception e){}
}
}
}
public void doPost(String str,SocketChannel sc){
boolean isok=false;
int index=str.indexOf('|');
if(index>0){
String name=str.substring(0,index);
String pswd=str.substring(index+1);
if(pswd==null){pswd="";}
if(name!=null){
if(name.equals(USERNAME)
&& pswd.equals(PASSWORD)
){
isok=true;
}else{
isok=false;
}
}else{
isok=false;
}
}else{
isok=false;
}
String result="";
if(isok){
result="ACK";
}else{
result="NAK!";
}
ByteBuffer bb = ByteBuffer.allocate( result.length() );
bb.put(result.getBytes());
bb.flip();
try {
sc.write(bb);
} catch (IOException e) {
e.printStackTrace();
}
bb.clear();
}
}
下面贴工程2
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class UserClient implements ActionListener{
JFrame jf;
JPanel jp;
JLabel label_name;
JLabel label_pswd;
JTextField userName;
JButton jb;
JPasswordField paswrd;
JLabel hintStr;
public UserClient (){
jf=new JFrame("XXX 登陆系统");
jp=new JPanel();
jf.setContentPane(jp);
jf.setPreferredSize(new Dimension(350,220));
jp.setPreferredSize(new Dimension(350,220));
jp.setBackground(Color.gray);
label_name=new JLabel();
label_name.setPreferredSize(new Dimension(150,30));
label_name.setText("请输入帐户(数字或英文):");
userName=new JTextField();
userName.setPreferredSize(new Dimension(150,30));
jp.add(label_name);
jp.add(userName);
label_pswd=new JLabel();
label_pswd.setPreferredSize(new Dimension(150,30));
label_pswd.setText("请输入密码:");
jp.add(label_pswd);
paswrd=new JPasswordField();
paswrd.setPreferredSize(new Dimension(150,30));
jp.add(paswrd);
jb=new JButton("OK");
jb.setPreferredSize(new Dimension(150,30));
jb.setText("确 定");
jb.addActionListener( this);
jp.add(jb);
hintStr=new JLabel();
hintStr.setPreferredSize(new Dimension(210,40));
hintStr.setText("");
hintStr.setForeground(Color.RED);
jp.add(hintStr);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private String name;
private String pswd;
public void actionPerformed(ActionEvent e) {
name=userName.getText().trim();
pswd=new String(paswrd.getPassword());
if(pswd==null){
pswd="";
}else{
pswd=pswd.trim();
}
if(name!=null && name.length()>0){
hintStr.setText("正在验证客户端,请稍候...");
start();
}
}
OutputStream os;
Socket s;
InputStream is;
public void start(){
//建立联网线程
new Thread(new Runnable(){
public void run() {
try {
s=new Socket("127.0.0.1",5555);
//写
os=s.getOutputStream();
os.write(name.getBytes());
os.write('|');//用户名与密码用"|"分隔
os.write(pswd.getBytes());
os.flush();
//读内容
Thread.sleep(1000);
is=s.getInputStream();
int len=is.available();
System.out.println("len:"+len);
byte[] bytes=new byte[len];
is.read(bytes);
String resut=new String(bytes);
System.out.println("resut:"+resut);
//TODO 这里通过返回结果处理
if(resut.equals("ACK")){
hintStr.setText("验证成功,欢迎光临!");
}else{
paswrd.setText(null);
hintStr.setText("用户名或密码错误,请重新输入");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
// try {
// os.close();
// is.close();
// s.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
}
}).start();
}
public static void main(String[] args) {
new UserClient();
}
}
5. java 下载文件 Connection reset by peer: socket write error
这个是应为用户创建的是长连接,之后突然关闭了本地的handler,导致流读取错专误,所以就报属错了。
备注:这个如果是用来转发的,之后发现本地停止后报出来的,是不影响正常使用的,之后重新运行代码,会再次进行连接的。建议这个本地的socket不要随意的断开连接,否则如果有流没读完,可能会导致后续程序出问题的。
6. socket 线程 思路 java
网上参考别人的例子 改自己的程序 终于搞明白了 原来在socket的服务器端设置线程并不是像之前想的那样 建立一个连接后就重新开一个端口去监听 这样的想法遇到了很多问题 首先 当我把客户端 弄成for循指谈谈环递增的链接个格端口的时候 发现总是异常 因为服务器端的新的端口建立速度总是没有客户端的主动连接块 然后试图去让客户端创建新端口链接的速度降慢 但是一直没调试成功 并且即便是成功了 这个问侍纯题还是有隐患的 因为客户端的链接速度是不可控的 有两天 这个问题没有进展 后来在网上查到了 原来服务器端的线程 并不是用来创建新的端口的 之前也想过 一个服务器端不可能就连接一个客户端 但是没想出来解决办法 看了例子的提示后 才做出来 服务器端的线程是用来监听连接客户端的 即 当监听到客户端的连接请求时就会主动去创建一个socket线程去连接 完成客户端和服务器端的交互 后客户端自动断开链接
核心代码
Main 函数
ServerSocket serverSocket=null
boolean listening=true
try{
serverSocket=new ServerSocket( )
//创建一个ServerSocket在端口 监听客户请求
}catch(IOException e) {}
while(listening){ //永远循环监听
newServerThread(serverSocket accept() clientnum) start()
//监听到客户请求 根据得到的Socket对象和
客户计数创建服务线程 并启动之
clientnum++ //增加客户计数
}
serverSocket close() //关闭ServerSocket
设唯碰计ServerThread类
public class ServerThread extends Thread{
Socket socket=null //保存与本线程相关的Socket对象
int clientnum //保存本进程的客户计数
public ServerThread(Socket socket int num) { //构造函数
this socket=socket //初始化socket变量
clientnum=num+ //初始化clientnum变量
}
public void run() { //线程主体
try{//在这里实现数据的接受和发送
lishixin/Article/program/Java/hx/201311/26230
7. java socket多文件传输问题
参考思路:
1.先传文件名跟文件大小到 server。
2.开始传文件。
3.告诉server传完了。
4.客户端开始传下一个,重复123。
参考简单代码:
long fileLength;
int readLength;
long totalLength;
for (...)
{
// 读取文件名
// 读取文件长度保存到fileLength中
// 将totalLength置为0
while (1)
{
// 读取数据流,将实际读取的字节数保存在readLength中
totalLength += readLength;
if (totalLength >= fileLength) // 一个文件读取完成,break
// 这样就差不多了,不过这会把下一个文件的信息读到当前文件中来。
// 思路是fileLength - totalLength小于等于你设置的缓冲区长度时读取长度就是fileLength - totalLength
}
}
8. java socket如果服务端掉线 客户端应该怎样重连,实现的思路是怎么样的,最好能有具体的代码参考一下
看代码,不明白的追问
// 无穷循环,用于自动重新连接网关
while (true) {
// 捕获sleep异常
try {
// 捕获socket异常
try {
// 创建socket连接
socketGateway = new Socket("127.0.0.1", 8888);
// 创建输入输出对象
inStream = new DataInputStream(socketGateway.getInputStream());
outStream = new DataOutputStream(socketGateway.getOutputStream());
byte buf[] = new byte[1]; // 数据缓冲区
int intLen; // 读缓冲区返回的长度
// 无穷循环,用于读缓冲区数据
while (true) {
// 捕获读缓冲区异常
try {
intLen = inStream.read(buf, 0, 1);
// 可读长度-1则断开连接
if (intLen == -1) {
break;
}
// 处理buf
}
// 连接断开
catch (EOFException e) {
break;
}
// 接收数据超时
catch (SocketTimeoutException e) {
break;
}
// 超过数据包末尾
catch (IOException e) {
break;
}
}
} catch (Exception e) {
// 处理socket错误
}
// 休眠1秒后重连
sleep(1000);
} catch (Exception e) {
// 处理sleep错误
}
}