经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
026.3 网络编程 TCP聊天
来源:cnblogs  作者:_nbloser  时间:2018/10/11 9:32:47  对本文有异议

分为客户端和服务端,分别进行收发操作
##########################################################################
客户端:
###思路:
1、建立tcp客户端服务
    1.1因为是面向连接,必须有连接才有通信
    1.2在创建客户端时,就必须明确目的地址和端口
2、一旦连接建立,就有了传输数据的通道。就可以在通道中进行数据传输,这个传输是通过流实现的,是socket  io流
3、获取socket  io中的写动作就可以发送给服务端

###步骤:
1、创建socket对象,明确目的IP和端口
2、通过socket对象的getOutStream方法获取OutputStream对象
3、通过OutputStream对象写数据,实现发送
4、关闭socket对象

  1. ###代码:
  2. System.out.println("client start");
  3. //1、创建客户端对象,明确目的和端口
  4. Socket s = new Socket("192.168.10.141",10000);
  5. //2、获取socket流中的输出流,将数据发送给服务端
  6. OutputStream out = s.getOutputStream();
  7. //3、通过输出流写数据
  8. out.write("I miss you".getBytes());
  9. //4、关闭资源
  10. s.close();

 

####################################################################
服务端:
###思路:
1、创建socket服务器端服务。服务器监听一个端口
2、获取客户端对象
3、获取客户端的socket流的读取流
4、显示

###步骤:
1、创建ServerSocket服务器对象
2、通过ServerSocket对象的accept方法,获取客户端socket对象
3、通过客户端socket对象的getInetAddress().getHostAddress()   方法获取ip对象然后获取ip
4、通过客户端socket对象的getInputStream方法获取InputStream对象
5、通过InputStream对象的read方法获取客户端发送的数据。
6、关闭客户端socket对象。

  1. ###代码:
  2. System.out.println("服务器启动。。。");
  3. //1、创建服务器端对象
  4. ServerSocket ss = new ServerSocket(10003);
  5. //2、获取客户端对象
  6. Socket s = ss.accept();
  7. String ip = s.getInetAddress().getHostAddress();
  8. System.out.println(ip+"...connect");
  9. //3、通过客户端对象获取socket流的读取流
  10. InputStream in = s.getInputStream();
  11. byte[] buf = new byte[1024];
  12. int len = in.read(buf);
  13. String str = new String(buf,0,len);
  14. System.out.println(str);
  15. s.close();

 

################################################################################
简单互动的TCP通讯

  1. /*###
  2. * 案例二:实现客户端和服务端的收发过程。
  3. * 客户端
  4. */
  5. System.out.println("客户端2 启动.......");
  6. // 创建客户端socket对象。明确服务端地址和端口。
  7. Socket s = new Socket("192.168.1.223", 10004);
  8. // 发送数据,通过socket输出流完成。
  9. OutputStream out = s.getOutputStream();
  10. out.write("服务端,我来了".getBytes());
  11. // 读取服务端返回的数据,通过socket输入流
  12. InputStream in = s.getInputStream();
  13. byte[] buf = new byte[1024];
  14. int len = in.read(buf);
  15. String text = new String(buf,0,len);
  16. System.out.println(text);
  17. // 关闭资源。
  18. s.close();

 

  1. /*###
  2. * 案例二:实现客户端和服务端的收发过程。 服务器端。
  3. */
  4. System.out.println("服务端2启动.....");
  5. // 创建tcp服务端socket 明确端口。
  6. ServerSocket ss = new ServerSocket(10004);
  7. while (true) {
  8. // 获取客户端对象。
  9. Socket s = ss.accept();
  10. System.out.println(s.getInetAddress().getHostAddress()
  11. + ".....connected");
  12. // 读取客户端的发送过来的数据
  13. InputStream in = s.getInputStream();
  14. byte[] buf = new byte[1024];
  15. int len = in.read(buf);
  16. String text = new String(buf, 0, len);
  17. System.out.println(text);
  18. // 给客户端回馈数据。
  19. OutputStream out = s.getOutputStream();
  20. out.write("客户端,我已到收到,哦耶!".getBytes());
  21. // 关闭客户端
  22. s.close();
  23. }
  24. // 关闭服务端。如果不断的获取客户端,不用关闭服务端。
  25. // ss.close();

 

###########################################################################
我想写一个可以多次发送信息的程序,没有找到哪里错了

  1. public class TCPServer2
  2. {
  3. public static void main(String[] args) throws IOException
  4. {
  5. ServerSocket ss = new ServerSocket(10005);
  6. Socket s = ss.accept();
  7. ServerReceive sr = new ServerReceive(s);
  8. ServerSend ssend = new ServerSend(s);
  9. new Thread(sr).start();
  10. new Thread(ssend).start();
  11. }
  12. }
  13. class ServerSend implements Runnable{
  14. private Socket s;
  15. private OutputStream os;
  16. public ServerSend(Socket s) throws IOException {
  17. super();
  18. this.s = s;
  19. os = s.getOutputStream();
  20. }
  21. @Override
  22. public void run()
  23. {
  24. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  25. String line = null;
  26. try {
  27. while((line = br.readLine()) != null){
  28. os.write(line.getBytes());
  29. if("//over".equals(line)){
  30. break;
  31. }
  32. }
  33. s.close();
  34. } catch (IOException e) {
  35. }
  36. }
  37. }
  38. class ServerReceive implements Runnable{
  39. private Socket s;
  40. private InputStream is;
  41. public ServerReceive(Socket s) throws IOException {
  42. super();
  43. this.s = s;
  44. is = s.getInputStream();
  45. }
  46. @Override
  47. public void run()
  48. {
  49. while(true){
  50. byte[] buf = new byte[1024];
  51. try {
  52. int len = is.read(buf);
  53. String str = new String(buf,0,len);
  54. if("//over".equals(str)){
  55. break;
  56. }
  57. System.out.println(str);
  58. s.close();
  59. } catch (IOException e) {
  60. }
  61. }
  62. }
  63. }
TCPServer
  1. public class TCPClient2
  2. {
  3. public static void main(String[] args) throws UnknownHostException, IOException
  4. {
  5. Socket bothSocket = new Socket("127.0.0.1",10005);
  6. Send2 send = new Send2(bothSocket);
  7. Receive2 receive = new Receive2(bothSocket);
  8. new Thread(send).start();
  9. new Thread(receive).start();
  10. }
  11. }
  12. //创建发送和接收的类,使用多线程,继承runnable接口
  13. //多线程发送类
  14. class Send2 implements Runnable{
  15. private Socket s;
  16. OutputStream os;
  17. public Send2(Socket s) throws IOException {
  18. super();
  19. this.s = s;
  20. os = s.getOutputStream();
  21. }
  22. @Override
  23. public void run()
  24. {
  25. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  26. String line = null;
  27. try {
  28. while((line = br.readLine()) != null){
  29. os.write(line.getBytes());
  30. if("//over".equals(line)){
  31. break;
  32. }
  33. }
  34. s.close();
  35. } catch (IOException e) {
  36. }
  37. }
  38. }
  39. //多线程接收类
  40. class Receive2 implements Runnable{
  41. private Socket s;
  42. private InputStream is;
  43. public Receive2(Socket s) throws IOException {
  44. super();
  45. this.s = s;
  46. }
  47. @Override
  48. public void run()
  49. {
  50. while(true){
  51. byte[] buf = new byte[1024];
  52. try {
  53. is = s.getInputStream();
  54. int len = is.read(buf);
  55. String str = new String(buf,0,len);
  56. if("//over".equals(str)){
  57. break;
  58. }
  59. System.out.println(str);
  60. s.close();
  61. } catch (IOException e) {
  62. }
  63. }
  64. }
  65. }
TCPClient

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号