准备:
1:添加权限
2:手机电脑应连同一个wife(要联网的)
代码:
public class MainActivity extends AppCompatActivity {
private Button bt_send;
private static final String TAG="MainActivity------->";
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_send=(Button)findViewById(R.id.send);
bt_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try{
socket=new Socket("192.168.123.129",8080);
if(socket==null){
socket.isConnected();
Log.d(TAG, "开始链接");
}
OutputStream mOut=socket.getOutputStream();
mOut.write("我来了".getBytes());
mOut.flush();
socket.close();
}catch (IOException e){
e.printStackTrace();
Log.d(TAG, "连接失败");
}
}
}).start();
});
}
}
一些心得------:
socket一旦断开,就无法再重新连接了(相关资源已被释放掉了)。只能重新创建新的socket去连接。
如果创建 Socket socket=new Socket();
如下面的代码将输出false。
Socket socket = new Socket();
System.out.println(socket.isClosed());
先创建Socke对象再连接的例子:
Socket socket=new Socket();
URI uri = new java.net.URI("localhost:8080");
String host = uri.getHost(); int port = uri.getPort();
InetSocketAddress isa = new java.net.InetSocketAddress(host, port);
socket.connect(isa);
``
Socket类的方法]([https://www.cnblogs.com/furuihua/p/11295644.html]
一个服务端连接多个服务器,这时接受信息 的输入流需要开启线程,上代码:
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
int port=8779;
ServerSocket server=new ServerSocket(port);
System.out.println("server将一直等待链接的到来");
while(true){
final Socket socket=server.accept();
System.out.println("有客户端连接");
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
try{
InputStream inputStream=socket.getInputStream();
byte[] receive = new byte[1024];
int len=0;
while((len=inputStream.read(receive)) != -1)
{
StringBuilder sb=new StringBuilder();
sb.append(new String(receive,0,len));
System.out.println("来自:"+socket.getPort()+"消息为:"+sb.toString());
Writer writer=new OutputStreamWriter(socket.getOutputStream());
writer.write(String.format("hi,%d!today is sunny",socket.getPort()));
writer.flush();
System.out.println("["+socket.getPort()+"]回复客户端的消息发送成功!");
}
System.out.println(+socket.getPort()+"已断开");
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
}
}
在这里插入图片描述
遇到 客户端向服务器发送消息发现 software caused connection abort: recv failed问题:
产生这个异常的原因有多种方面,单就如 Software caused 所示,
是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错 .
错误截图:
这是出错代码:
public class client
{
public static void main(String[] args) {
try {
Socket socket=new Socket("127.0.0.1",8779); //输出流
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
printWriter.write("我是客户端1
printWriter.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
while(true){}
}
}
修改后:
区别在于我在socket.close();上加了一句,InoutStream inputStream=socket.getInoutStream();
产生这个异常的原因有多种方面,单就如 Software caused 所示,
是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错.
所以如果我不加 InoutStream inputStream=socket.getInoutStream();这句,客户端就会直接执行socket.close();,那服务器向客户端发送消息就会出现异常。
另一个疑问:
服务器用下面的代码的接受消息时,会把开头第一个字符丢失,也不知道为啥????百度了好久都找不到问题所在…
BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
byte[] receive = new byte[1024];
int read = bufferedInputStream.read(receive);
System.out.println("客服端收到消息:"+new String(receive));
用下面的代码就一切正常
InputStream inputStream=socket.getInputStream();
byte[] receive = new byte[1024];
int len=0;
while((len=inputStream.read(receive)) != -1)
{
StringBuilder sb=new StringBuilder();
sb.append(new String(receive,0,len));
System.out.println("来自:"+socket.getPort()+"消息为:"+sb.toString());
}