通过socket对象可以获取通信对方的socket信息

客户端:

import java.net.*;
import java.io.*; public class TestServer {
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(8888);
while(true) {
Socket s1 = s.accept();
OutputStream os = s1.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("Hello"+s1.getInetAddress()+"#port"+s1.getPort()+"bye bye");
dos.close();
s1.close();
}
} catch(IOException e) {
System.out.println("程序运行出错:"+e);
}
}
}

用户端:

import java.net.*;
import java.io.*; public class TestClient {
public static void main(String[] args) {
try {
Socket s1 = new Socket("192.168.56.1",8888);
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readUTF());
dis.close();
s1.close();
} catch(ConnectException connExc) {
connExc.printStackTrace();
System.out.println("服务器连接失败!");
} catch(IOException e) {
e.printStackTrace();
}
}
}

结果:    Hello/192.168.56.1#port56660bye bye

s1.getInetAddress()    这个是拿到ip地址的意思,注意这里拿的是客户端的ip地址。因为这个s1拿的是对面client的ip

s1.getPort()        拿的是客户端的端口号  (注意,拿到的端口号可不是8888,8888是服务器的端口号,拿到的端口号56660是本身这个客户端连上去显示的端口号,是随机选的。)

然后我们试一个互相两边都能通话的例子:

server:

import java.net.*;
import java.io.*; public class TestSocketServer {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
ServerSocket ss = new ServerSocket(5888);
Socket socket = ss.accept();
in = socket.getInputStream();
out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
DataInputStream dis = new DataInputStream(in);
String s = null ;
if((s = dis.readUTF())!=null) {
System.out.println(s);
System.out.println("from"+socket.getInetAddress());
System.out.println("port"+socket.getPort());
}
dos.writeUTF("hi,fuck you ");
dis.close();
dos.close();
socket.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}

client:

import java.net.*;
import java.io.*; public class TestSocketClient {
public static void main(String[] args) {
InputStream is = null;
OutputStream os = null;
try {
Socket socket = new Socket("localhost",5888);
is = socket.getInputStream();
os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("ok!yes you are right!");
String s = null;
if((s = dis.readUTF())!=null) {
System.out.println(s);
}
dos.close();
dis.close();
socket.close();
} catch(UnknownHostException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}
}

必须是一个先读,一个先写。要是两个都先写,就会两个都卡在那。因为这个readUTF()是堵塞式的。不然就会死死地卡在那。

Java socket2的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. java socket收发http协议内容

    来自:https://www.oschina.net/code/snippet_2009881_48232 import java.io.BufferedReader; import java.io. ...

  3. #20145205 《Java程序设计》第10周学习总结

    教材学习内容总结 教材学习内容总结 Java的网络编程 •网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. •java.net包中J2SE的API包含有类和接口,它们提供低 ...

  4. 黑马程序员:Java编程_网络编程

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 网络编程就是两个(或多个)设备(例如计算机)之间的数据传输,更具体的说,网络编程 ...

  5. JAVA基础知识(转)

    本文就java基础部分容易混淆的一些知识点进行了一下总结.因为Java本身知识点非常多,不可能在很短的篇幅就能叙述完,而且就某一个点来讲,如欲仔细去探究,也能阐述的非常多.这里不做全面仔细的论述,仅做 ...

  6. 20145213《Java程序设计》第十周学习总结

    20145213<Java程序设计>第十周学习总结 教材学习总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接 ...

  7. 20145206《Java程序设计》第10周学习总结

    20145206 <Java程序设计>第10周学习总结 博客学习内容总结 什么是网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定 ...

  8. 21045308刘昊阳 《Java程序设计》第十周学习总结

    21045308刘昊阳 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴:程序员所作的事情 ...

  9. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

随机推荐

  1. protobuf 一个c++示例

    http://wangjunle23.blog.163.com/blog/static/11783817120126155282640/     1.在.proto文件中定义消息格式 2.使用prot ...

  2. poj2488--A Knight&#39;s Journey(dfs,骑士问题)

    A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31147   Accepted: 10 ...

  3. The Pilots Brothers&#39; refrigerator-DFS路径打印

    I - The Pilots Brothers' refrigerator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format ...

  4. Random-随机生成电话号

    package test1; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; ...

  5. 发挥bat的作用

    from 转自:http://blog.csdn.net/hitlion2008/article/details/7467252 1.什么是Windows BATCH BATCH也就是批处理文件,有时 ...

  6. Chapter1-data access reloaded:Entity Framework(上)

    本章包括以下几个部分: 1.DataSet and classic ADO.NET approach2.Object model approach3.Object/relational mismatc ...

  7. C语言中string char int类型转换

    C语言中string -- ::) 转载 ▼ 标签: 操作符 int char c语言 类型转换 分类: C/Cpp ,char型数字转换为int型 "; printf(]-');//输出结 ...

  8. YTU 2586: 填空题B-字画鉴别

    2586: 填空题B-字画鉴别 时间限制: 1 Sec  内存限制: 128 MB 提交: 509  解决: 131 题目描述 注:本题只需要提交填写部分的代码,请按照C语言方式提交. 古玩店老板小勇 ...

  9. UltraEdit mac破解版

    2018-01-17 增加18.00.0.19破解 去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成! printf '\x31\xC0\xFF\xC0\xC3\x90' | dd s ...

  10. (转) SQL Server中 ldf 文件过大的解决方法

    原文地址:http://blog.itpub.net/35489/viewspace-616459/ 在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下 ...