java Socket通信,客户端与服务端相互发消息

1.通信过程

网络分为应用层,http、ssh、telnet就是属于这一类,建立在传输层的基础上、其实就是定义了各自的编码解码格式,分层如下:

2.Socket连接

上述通信都要先在传输层有建立连接的基础上才能完成,TCP通过三次握手建立连接:
 

Socket与http的区别可以看下这个:
https://www.cnblogs.com/meier1205/p/5971313.html
还有搜索:http下午茶

3.JAVA socket 客户端与服务端互发消息

实现结构图:
 

客户端和服务端分别通过俩个线程来完成发送消息和接受消息,此前需要等待客户端与服务器端建立连接,这个java程序都帮你写好了,接收后就可以发消息了:

服务端代码:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public  class  Server_Test extends Thread{
    ServerSocket server = null;
    Socket socket = null;
    public Server_Test(int port) {
        try {
            server = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run(){

        super.run();
        try{
            System.out.println("wait client connect...");
            socket = server.accept();
            new sendMessThread().start();//连接并返回socket后,再启用发送消息线程
            System.out.println(socket.getInetAddress().getHostAddress()+"SUCCESS TO CONNECT...");
            InputStream in = socket.getInputStream();
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len=in.read(buf))!=-1){
                System.out.println("client saying: "+new String(buf,0,len));
            }

        }catch (IOException e){
            e.printStackTrace();
        }
    }

    class sendMessThread extends Thread{
        @Override
        public void run(){
            super.run();
            Scanner scanner=null;
            OutputStream out = null;
            try{
                if(socket != null){
                    scanner = new Scanner(System.in);
                    out = socket.getOutputStream();
                    String in = "";
                    do {
                        in = scanner.next();
                        out.write(("server saying: "+in).getBytes());
                        out.flush();//清空缓存区的内容
                    }while (!in.equals("q"));
                    scanner.close();
                    try{
                        out.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    //函数入口
    public static void main(String[] args) {
        Server_Test server = new Server_Test(1234);
        server.start();
    }
}

客户端代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client extends Thread {

    //定义一个Socket对象
    Socket socket = null;

    public Client(String host, int port) {
        try {
            //需要服务器的IP地址和端口号,才能获得正确的Socket对象
            socket = new Socket(host, port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        //客户端一连接就可以写数据个服务器了
        new sendMessThread().start();
        super.run();
        try {
            // 读Sock里面的数据
            InputStream s = socket.getInputStream();
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = s.read(buf)) != -1) {
                System.out.println(new String(buf, 0, len));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //往Socket里面写数据,需要新开一个线程
    class sendMessThread extends Thread{
        @Override
        public void run() {
            super.run();
            //写操作
            Scanner scanner=null;
            OutputStream os= null;
            try {
                scanner=new Scanner(System.in);
                os= socket.getOutputStream();
                String in="";
                do {
                    in=scanner.next();
                    os.write((""+in).getBytes());
                    os.flush();
                } while (!in.equals("bye"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            scanner.close();
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //函数入口
    public static void main(String[] args) {
        //需要服务器的正确的IP地址和端口号
        Client clientTest=new Client("127.0.0.1", 1234);
        clientTest.start();
    }
}

自己改写的,主要变化在于不用那么费事的读写

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class LuClient extends Thread {

    //定义一个Socket对象
    Socket socket = null;

    public LuClient(String host,int post){
        Exception q=null;
        while(true){
            try {
                socket = new Socket(host,post);

            } catch (Exception e) {
                q=e;
            }finally{
                if(q==null)
                    break;
                else
                    continue;
                }
        }

    }

    @Override
    public void run() {
        //客户端一连接就可以写数据个服务器了
        //new sendMessThread().start();
        super.run();
        // 读Sock里面的数据
        try {
            InputStream is=socket.getInputStream();
            InputStreamReader isr=new InputStreamReader(is);
            BufferedReader br=new BufferedReader(isr);
            String message=null;
            while((message=br.readLine())!=null) {
                if(message.equals("kaishichongxinguihua")) {
                    new sendMessThread().start();
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //往Socket里面写数据,需要新开一个线程
    class sendMessThread extends Thread{
        @Override
        public void run() {
            super.run();
            //写操作
             ArrayList<String> array=new ArrayList<String>();
             int N = 1000;
             int[][] Graph = {
                    { 0, 1, 1, N, N, 1, N, N, N },
                    { 1, 0, N, N, N, N, 1, N, N },
                    { 1, N, 0, 1, 1, N, N, N, N },
                    { N, N, 1, 0, N, N, N, N, N },
                    { N, N, 1, N, 0, N, N, 1, N },
                    { 1, N, N, N, N, 0, N, N, N },
                    { N, 1, N, N, N, N, 0, 1, N },
                    { N, N, N, N, 1, N, 1, 0, 1 },
                    { N, N, N, N, N, N, N, 1, 0 } };
            array=Dijkstra.dijkstra(0, Graph,8);

            try{
                OutputStream out= socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(out);
                PrintWriter pw = new PrintWriter(osw, true);
                pw.println("chongxinguihuahaole");

            }catch(Exception e){
                //e.printStackTrace();
            }

        }
    }
    //函数入口
    public static void main(String[] args) {
        //需要服务器的正确的IP地址和端口号
        LuClient clientTest=new LuClient("192.168.31.126",8090);
        clientTest.start();
    }
}

原文地址:https://www.cnblogs.com/manmanchanglu/p/12081625.html

时间: 2024-10-13 13:25:48

java Socket通信,客户端与服务端相互发消息的相关文章

Socket通信客户端和服务端代码

这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; usin

socket的客户端和服务端(Windows控制台程序)

首先是两个程序,分别是socket的客户端和服务端.(在windows系统vc6.0编译)服务器端:#include <Winsock2.h>#include <stdio.h>#pragma comment(lib,"WS2_32.lib")void main(){    WSADATA wsd;    SOCKET server;                                            //服务器socket    SOCKAD

Python socket编程客户端与服务端通信

目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM #服务端的ip地址 server_ip = '127.0.0.1' #服务端socket绑定的端口号 server_port = 20000 if __name__ == '__main__': while True: str_msg = input("请输入要发送信息:") if str_msg != "&

用PHP的socket实现客户端到服务端的通信

服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'localhost'; //设置用111端口进行通信 $port = 111; //创建SOCKET if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket创建失败原因 " . socket

基于socket.io客户端与服务端的相互通讯

socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先下载相关依赖 cnpm install express socket.io 2.服务端代码 const express = require("express"); const io = require("socket.io"); const app = express(

java网络编程客户端与服务端原理以及用URL解析HTTP协议

常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb,下面有一个文件1.html) 服务端原理 自定义一个服务端,使用自己已有的客户端IE浏览器,了解一下客户端都发送了什么请求. 1 package cn.ie_server; 2 3 import java.io.IOException; 4 import java.io.InputStream;

采用异步socket实现客户端和服务端通信的demo

MAC系统基于UNIX的核心系统增强了系统的稳定性.性能以及响应能力.由于unix需要付费,以及版本基本上不更新,很多采用unix系统的电脑转用linux,unix处于停滞不前状态,而linux由于是开源的,免费的,所以全球很多技术大牛在不断改进它,给它增加新技术,增加新理念,是它日新月异的发展.所以mac os后期主要借鉴linux的新技术,所以现在的mac os更像linux而非unix.可以说苹果系统是从linux和unix演化而来的,所以linux的socket的编程对苹果系统仍然有效.

基于socket的客户端和服务端聊天机器人

服务端代码如下: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms; namespace Client{ public partial class Form1 : Form { public Form1() { InitializeComponent(); //对 Windows 窗体控件进行线程安全调

基于socket的客户端和服务端聊天简单使用 附Demo

功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听Listen(100) 100代表的监听请求队列的长度 接受请求的客户端Socket,接受消息 Receive 接受的字节与文本间的互转 客户端 只有一个分离接受服务端发送消息的线程 几大对象 客户端Socket 客户端连接Connect 客户端发送 客户端接受 接受的字节与文本间的互转 附Demo下