精华内容
下载资源
问答
  •  本人虽然只是个大一的学生,这个学期刚刚学完Java,但是本人对Java有着极大的学习兴趣和热情,各种寻找资源提升自己的实力。这不,刚刚看完毕向东老师的网络编程教学视频,自己动脑想了这个项目,并动手实现了这...

            TCP是一种基于连接的通信协议,必须要进行连接才能通信。

            

               本人虽然只是一个大一的学生,这个学期刚刚学完Java,但是本人对Java有着极大的学习兴趣和热情,各种寻找资源提升自己的实力。这不,刚刚看完毕向东老师的网络编程教学视频,自己动脑想了这个项目,并动手实现了这个项目,还是感到挺开心的。

               现在,我来展示一个我自己写的一个基于TCP协议的Java服务器与多个客户端聊天程序。(各位放心,我注释写的非常详细,但愿不要嫌我啰嗦就好吐舌头

                

                客户端代码如下:


    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    import java.net.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    /**
     *
     * @author flying duck
     */
    /**
     *服务器与一个或多个客户端聊天,客户端设计思路:
     * 1、创建客户端Socket对象,指定要连接的服务器IP和端口号。
     * 2、建立连接后,通过Socket的方法获取网络IO流。
     * 3、通过事件监听机制把文本框中的消息打包成字节数组,通过网络输出流写到网络中,由服务器读入。
     * 4、事先开启一个线程,通过网络输入流,接收来自服务器的消息,并显示在聊天文本区域。
     * 5、当聊天窗口关闭时,断开与服务器的连接。
     * 
     */
    public class ClientFrame extends JFrame implements ActionListener,Runnable{ //客户端聊天窗口,实现两个接口,作为动作事件侦听器和线程任务类。
        
        Socket soc; //客户端套接字。
        
        JTextField jf;  //文本框。
        
        JTextArea jta;  //文本区域。
        
        JButton jb; //按钮。
        
        JScrollPane jsp;    //滚动面板。
        
        InputStream in;     //输入流,用来指向Socket方法获取的网络输入流。
        
        OutputStream out;   //输出流,用来指向Socket方法获取的网络输出流。
        
        public ClientFrame() throws IOException{    //构造方法,用来初始化对象以及做一些设置。
            
            super("客户端聊天框");      //调用超类JFrame的构造方法设置聊天框的标题。
            
            soc=new Socket("127.0.0.1",10000);  //实例化客户端套接字,指定要连接的服务器程序的IP和端口。
            
            in=soc.getInputStream();    //获取Socket的输入流。
            
            out=soc.getOutputStream();  //获取Socket的输出流。
            
            jf=new JTextField(20);      //初始化化文本框,设置容量为20个字符。
            
            jta=new JTextArea(20,20);   //初始化文本区域并设置其为20行和20列(一个字符代表一列)。
            
            jb=new JButton("发送");     //初始化按钮。
            
            jsp=new JScrollPane(jta);   //初始化滚动面板,并把文本区域放置在滚动面板中。
            
            this.setLayout(new FlowLayout());   //设置窗体布局为流式布局(此布局为从左向右一次添加组件,一行放不下了转到第二行)。
            
            this.add(jf);   //将文本框加到窗体中。
            
            this.add(jb);   //将按钮加到窗体中。
            
            this.add(jsp);  //把滚动面板加到窗体中。
            
            jb.addActionListener(this); //为按钮注册动作事件侦听器(当点击按钮时触发动作事件),因为该类实现了动作事件侦听器接口,所以该类对象就是侦听器。
            
            jf.addActionListener(this); //为文本框注册动作事件侦听器,当按下回车触发动作事件。
            
            this.setBounds(300,300,400,400);    //设置窗体边界和大小。
            
            this.setVisible(true);      //设置窗体可见(窗体默认是不可见的)。
            
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设置窗体默认关闭操作。
            
        }
        public void actionPerformed(ActionEvent e){     //ActionListener接口里的方法,必须实现,用来处理当点击按钮或者在文本框按下回车后的动作事件。
            
            String jfText=jf.getText(); //获取文本框中的内容。
            
            if(jfText.length()>0){  //当文本框里面字符串长度大于零时(如果长度为0,则没有意义)执行下面语句。
                
                byte[] by=jfText.getBytes();    //将字符串变为字节数组。
                
                try {
                    out.write(by);  //将字节数组写入网络输出流中,由服务器来接收。
                    
                    jta.append("你说:"+jfText+"\n");   //将客户端的消息显示在文本区内。
                    
                    jf.setText("");     //发送完消息后,清空文本框(以便下次输入)。
                    
                } catch (IOException ex) {
                    Logger.getLogger(ClientFrame.class.getName()).log(Level.SEVERE, null, ex);//一种异常处理,不必深究。
                    
                }
            }
        }
        public void run(){  //Runnable接口中的方法(必须实现),线程开启后执行的代码。
            
            while(true){        //因为要不断地接收消息,所以线程要一直运行,所以用while(true)。
                
                byte[] b=new byte[1024];    //用来接收服务器发来的消息。
                
                try {
                    int count=in.read(b);   //用网络输入流读取来自服务器的消息,返回读取的有效字节个数。
                    
                    jta.append("服务器说:"+new String(b,0,count)+"\n");    //将服务器发来的消息显示在文本区中。
                    
                } catch (IOException ex) {
                    Logger.getLogger(ClientFrame.class.getName()).log(Level.SEVERE, null, ex);  //一种异常处理,不必深究。
                }
            }
        }

    }



    import java.io.IOException;


    /**
     *
     * @author flying duck
     */
    public class Client {


        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws IOException {
            // TODO code application logic here
            ClientFrame cf=new ClientFrame();   //实例化窗口对象,同时其也是线程任务对象。
            Thread reciver=new Thread(cf);      //由线程任务对象创建一个线程。
            reciver.start();        //开启线程,接收来自服务器的消息。
        }
        
    }


               服务器端代码如下:


    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import javax.swing.*;
    import java.net.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    /**
     *
     * @author fly duck
     */
    /**
     * 服务器与一个或多个客户端聊天,服务器端设计思路:
     * 1、创建服务器ServerSocket对象(指定端口),服务器在正常运行时处于永久开启状态(while(true))。
     * 2、调用ServerSocket的方法接受客户端的连接请求。
     * 3、创建一个线程类,每当服务器接收到了一个客户端连接请求并成功连接时,为这个客户端打开一个聊天窗口。
     * 4、通过获取的客户端对象,获取与客户端进行数据通信的网络IO流。
     * 5、在处理客户端的线程run方法里开启另一种线程,用来接收客户端发来的信息。
     * 6、通过事件监听机制把文本框中的消息打包成字节数组,通过网络输出流写到网络中,由客户端读入。
     * 7、当客户端断开连接时,服务器断开与客户端的连接。
     * 
     */
    public class ServerFrame extends JFrame implements ActionListener,Runnable{     //服务器聊天窗口,实现两个接口,作为动作事件侦听器和线程任务类。
        
        Socket soc; //客户端对象,服务器接收到的客户端。
        
        JTextField jf;  //文本框。
        
        JTextArea jta;  //文本区域。
        
        JButton jb; //按钮。
        
        JScrollPane jsp;    //滚动面板。
        
        InputStream in;     //网络字节输入流。
        
        OutputStream out;       //网络字节输出流。
        
        public ServerFrame(Socket soc) throws IOException{      //构造方法,用来初始化对象以及做一些设置。
            
            super("服务器端聊天");  //调用超类JFrame的构造方法设置聊天框的标题。
            
            this.soc=soc;       //传递服务器接收到的客户端套接字。
            
            in=soc.getInputStream();    //服务器的输入流,拿的是客户端的输入流。这样,服务器与客户端进行数据传输便知道是与哪个客户端。
            
            out=soc.getOutputStream();  //服务器的输出流,拿的是客户端的输出流。
            
            jf=new JTextField(20);      //初始化化文本框,设置容量为20个字符。
            
            jta=new JTextArea(20,20);   //初始化文本区域并设置其为20行和20列(一个字符代表一列)。
            
            jb=new JButton("发送");     //初始化按钮。
            
            jsp=new JScrollPane(jta);   //初始化滚动面板,并把文本区域放置在滚动面板中。
            
            this.setLayout(new FlowLayout());   //设置窗体布局为流式布局(此布局为从左向右一次添加组件,一行放不下了转到第二行)。
            
            this.add(jf);       //将文本框加到窗体中。
            
            this.add(jb);       //将按钮加到窗体中。
            
            this.add(jsp);      //把滚动面板加到窗体中。
            
            jb.addActionListener(this);     //为按钮注册动作事件侦听器(当点击按钮时触发动作事件),因为该类实现了动作事件侦听器接口,所以该类对象就是侦听器。
            
            jf.addActionListener(this);     //为文本框注册动作事件侦听器,当按下回车触发动作事件。
            
            this.setBounds(300,300,400,400);    //设置窗体边界和大小。
            
            this.setVisible(true);      //设置窗体可见(窗体默认是不可见的)。
            
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //设置窗体默认关闭操作。  
            
        }
        public void actionPerformed(ActionEvent e){     //ActionListener接口里的方法,必须实现,用来处理当点击按钮或者在文本框按下回车后的动作事件。
            
            String jfText=jf.getText();     //获取文本框中的内容。
            
            if(jfText.length()>0){      //当文本框里面字符串长度大于零时(如果长度为0,则没有意义)执行下面语句。
                
                byte[] by=jfText.getBytes();        //将字符串变为字节数组。
                
                try {
                    out.write(by);      //将字节数组写入网络输出流中,由客户端来接收。
                    
                    jta.append("你说:"+jfText+"\n");   //将服务器的消息显示在文本区内。
                    
                    jf.setText("");     //发送完消息后,清空文本框(以便下次输入)。
                    
                } catch (IOException ex) {
                    Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);  //一种异常处理,不必深究。
                }
            }
        }
        public void run(){  //Runnable接口中的方法(必须实现),线程开启后执行的代码。
            
            while(true){    //因为要不断地接收消息,所以线程要一直运行,所以用while(true)。
                
                byte[] by=new byte[1024];   //用来接收客户端发来的消息。
                try {
                    int count=in.read(by);      //用网络输入流读取来自客户端的消息,返回读取的有效字节个数。
                    
                    jta.setText("客户端说:"+new String(by,0,count)+"\n");  //将客户端发来的消息显示在文本区中。
                    
                } catch (IOException ex) {
                    Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex);  //一种异常处理,不必深究。
                } 
            }
        }

    }


    import java.io.IOException;
    import java.net.*;
    import java.util.logging.Level;
    import java.util.logging.Logger;


    /**
     *
     * @author flying duck
     */
    /**
     * 这个线程类是为了每当有一个客户端连接时,为这个客户端开启一个聊天窗口。
     */
    public class DealWithEveryClient extends Thread{
        Socket soc;     //客户端对象,服务器接收到的客户端。
        
        public DealWithEveryClient(Socket soc){     //构造方法。
            
            this.soc=soc;       //传递服务器接收到的客户端套接字。
            
        }
        public void run(){      //Thread类中的方法(必须重写),线程开启后执行的代码。
            
            try {
                ServerFrame sf=new ServerFrame(soc);    //创建一个服务器聊天窗口
                
                Thread thread=new Thread(sf);       //实例化接收客户端消息的线程对象。
                
                thread.start();     //开启该线程。
            } catch (IOException ex) {
                Logger.getLogger(DealWithEveryClient.class.getName()).log(Level.SEVERE, null, ex);      //一种异常处理,不必深究。
            }
        }
    }



    import java.io.IOException;
    import java.net.*;
    /**
     *
     * @author flying duck
     */
    public class Server {


        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws IOException {
            // TODO code application logic here
            ServerSocket ss=new ServerSocket(10000);        //创建服务器端套接字,指定该服务器程序的端口。
            
            while(true){        //正常情况下,服务器程序要一直运行,以便随时都能接收客户端的连接。
                
                Socket soc=null;        //客户端套接字对象,初始化为空。
                
                soc=ss.accept();        //服务器接收到客户端连接,返回该客户端对象,此方法会一直阻塞,直到接收到客户端的连接。
                
                if(soc!=null){      //如果客户端连接了,执行下面代码。
                    
                    DealWithEveryClient dec=new DealWithEveryClient(soc);   //为每个客户端开启一个聊天窗口。
                    
                    dec.start();        //开启此线程。
                }
            }
        }
        
    }



    展开全文
  • 虽然是个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会其简洁和强大有更深的认识,c++实在过于繁琐,java...

    go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost

    的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个而不会耗尽系统的资源。仅举一简单例子,go语言写的服务器程序会解析来自Java的json格式的数据,修改后返回:

    go代码:

    package main

    import (

    "fmt"

    "net"

    "encoding/json"

    )

    type Person struct{

    Name string

    Id   int

    Lks []string

    }

    func doServerStuff(conn net.Conn){

    remote:=conn.RemoteAddr().String()

    fmt.Println(remote," connected!")

    for {

    buf:=make([]byte,512)

    size,err:=conn.Read(buf)

    if err!=nil{

    fmt.Println("Read Error:",err.Error());

    return

    }

    //fmt.Println("data from client:",string(buf),"size:",size)

    var person Person

    err=json.Unmarshal(buf[:size],&person)

    if err!=nil{

    fmt.Println("Unmarshal Error:",err.Error());

    return

    }

    fmt.Println("Person after Unmarshal:",person)

    person.Id+=2

    buf,err=json.Marshal(person)

    if err!=nil{

    fmt.Println("Marshal Error:",err.Error());

    return

    }

    conn.Write(buf)

    conn.Close()

    break

    }

    }

    func main(){

    fmt.Println("Starting the server...")

    listener,err:=net.Listen("tcp","0.0.0.0:50000")

    if err!=nil{

    fmt.Println("Listen Error:",err.Error())

    return

    }

    for{

    conn,err:=listener.Accept()

    if err!=nil{

    fmt.Println("Accept Error:",err.Error())

    return

    }

    go doServerStuff(conn)

    }

    }

    通过关键字go即可完成并发的处理 ,go语言的哲学就是引入尽可能少的关键字和特性,编写最少的代码完成更多的功能,并且还提供了很好的工程管理和单元测试,一个go命令搞定一切,不需要任何类似Makefile或build.xml或pom.xml(maven使用的)之类的项目文件。因此go语言的作者们认为,c++没什么好学的,值得学习的是c语言。

    上面的代码中需要注意的是:

    1.struct的变量名要大写

    2.收到 socket的包之后要进行json解码,需传入实际的数据长度,如json.Unmarshal(buf[:size],&person)

    Java代码:

    import java.net.*;

    import java.io.*;

    import net.sf.json.JSONObject;

    public class JSonTest {

    /**

    * @param args

    */

    private static Socket socket;

    private static BufferedReader in;

    private static PrintWriter out;

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    JSONObject jsonObj=new JSONObject();

    jsonObj.put("Name","liangyongs");

    jsonObj.put("Id", 31);

    String[] likes={"java","golang","clang"};

    jsonObj.put("Lks", likes);

    System.out.println("Object before sending to golang side:");

    System.out.println(jsonObj);

    try{

    socket=new Socket("127.0.0.1",50000);

    in=new BufferedReader(new InputStreamReader(socket.getInputStream()));

    out=new PrintWriter(socket.getOutputStream(),true);

    out.println(jsonObj);

    String line=in.readLine();

    System.out.println("Object read from golang side:");

    jsonObj=JSONObject.fromObject(line);

    System.out.println(jsonObj.get("Id"));

    socket.close();

    }

    catch(IOException e){

    System.out.println(e);

    }

    }

    }

    这样可以传递任意数据,即使go语言一方,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,方便而简单。

    go语言可以使用gdb调试,也可以直接嵌套C语言,所以不用担心支持go的库少,c语言可以搞定就行了,而且c的数据类型可以很容易的转换成go的数据类型,go也支持指针,支持goto,不久的将来可以在编译器级别支持多核编程。

    有疑问加站长微信联系(非本文作者)

    展开全文
  • 虽然是个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会其简洁和强大有更深的认识,c++实在过于繁琐,java...

    go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost

    的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个而不会耗尽系统的资源。仅举一简单例子,go语言写的服务器程序会解析来自Java的json格式的数据,修改后返回:

    go代码:

    package main

    import (

    "fmt"

    "net"

    "encoding/json"

    )

    type Person struct{

    Name string

    Id   int

    Lks []string

    }

    func doServerStuff(conn net.Conn){

    remote:=conn.RemoteAddr().String()

    fmt.Println(remote," connected!")

    for {

    buf:=make([]byte,512)

    size,err:=conn.Read(buf)

    if err!=nil{

    fmt.Println("Read Error:",err.Error());

    return

    }

    //fmt.Println("data from client:",string(buf),"size:",size)

    var person Person

    err=json.Unmarshal(buf[:size],&person)

    if err!=nil{

    fmt.Println("Unmarshal Error:",err.Error());

    return

    }

    fmt.Println("Person after Unmarshal:",person)

    person.Id+=2

    buf,err=json.Marshal(person)

    if err!=nil{

    fmt.Println("Marshal Error:",err.Error());

    return

    }

    conn.Write(buf)

    conn.Close()

    break

    }

    }

    func main(){

    fmt.Println("Starting the server...")

    listener,err:=net.Listen("tcp","0.0.0.0:50000")

    if err!=nil{

    fmt.Println("Listen Error:",err.Error())

    return

    }

    for{

    conn,err:=listener.Accept()

    if err!=nil{

    fmt.Println("Accept Error:",err.Error())

    return

    }

    go doServerStuff(conn)

    }

    }

    通过关键字go即可完成并发的处理 ,go语言的哲学就是引入尽可能少的关键字和特性,编写最少的代码完成更多的功能,并且还提供了很好的工程管理和单元测试,一个go命令搞定一切,不需要任何类似Makefile或build.xml或pom.xml(maven使用的)之类的项目文件。因此go语言的作者们认为,c++没什么好学的,值得学习的是c语言。

    上面的代码中需要注意的是:

    1.struct的变量名要大写

    2.收到 socket的包之后要进行json解码,需传入实际的数据长度,如json.Unmarshal(buf[:size],&person)

    Java代码:

    import java.net.*;

    import java.io.*;

    import net.sf.json.JSONObject;

    public class JSonTest {

    /**

    * @param args

    */

    private static Socket socket;

    private static BufferedReader in;

    private static PrintWriter out;

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    JSONObject jsonObj=new JSONObject();

    jsonObj.put("Name","liangyongs");

    jsonObj.put("Id", 31);

    String[] likes={"java","golang","clang"};

    jsonObj.put("Lks", likes);

    System.out.println("Object before sending to golang side:");

    System.out.println(jsonObj);

    try{

    socket=new Socket("127.0.0.1",50000);

    in=new BufferedReader(new InputStreamReader(socket.getInputStream()));

    out=new PrintWriter(socket.getOutputStream(),true);

    out.println(jsonObj);

    String line=in.readLine();

    System.out.println("Object read from golang side:");

    jsonObj=JSONObject.fromObject(line);

    System.out.println(jsonObj.get("Id"));

    socket.close();

    }

    catch(IOException e){

    System.out.println(e);

    }

    }

    }

    这样可以传递任意数据,即使go语言一方,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,方便而简单。

    go语言可以使用gdb调试,也可以直接嵌套C语言,所以不用担心支持go的库少,c语言可以搞定就行了,而且c的数据类型可以很容易的转换成go的数据类型,go也支持指针,支持goto,不久的将来可以在编译器级别支持多核编程。

    有疑问加站长微信联系(非本文作者)

    展开全文
  • java和golang(go语言)通信的例子。

    千次阅读 2013-10-16 22:10:20
    虽然是个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会其简介和强大有更深的认识,c++实在过于繁琐,java...
    go语言是一个系统级语言,好处非常多。虽然是一个静态编译型语言,但可以像动态语言一样写程序,语言本身可以提供编写应用程序所需的基本组件,而不用引入第三方的包。如果了解c++、java、python等,会对其简洁和强大有更深的认识,c++实在过于繁琐,java也没有想象的简单,python的效率和go不是一个数量级的。那么多的特性,印象最深的就是其对并发的支持,优雅而高效。一般情况下并发通过进程、线程、基于异步IO的回调来实现,进程和线程不能大量的创建,如超过1万个系统资源就不堪重负了,回调可以尽可能少的创建线程,但用法不太符合自然习惯,比如boost
     的asio就是一个很好的处理并发的框架,使用得当可以写出高效优雅的服务器程序。而go则在语言级别支持协程,协程是一种轻量级线程,可以创建百万个而不会耗尽系统的资源。仅举一简单例子,go语言写的服务器程序会解析来自Java的json格式的数据,修改后返回:
    go代码:
    package main
    import (
            "fmt"
            "net"
            "encoding/json"
    )
    type Person struct{
            Name string
            Id   int
            Lks []string
    }
    func doServerStuff(conn net.Conn){
            remote:=conn.RemoteAddr().String()
           fmt.Println(remote," connected!")
            for {
                    buf:=make([]byte,512)
                   size,err:=conn.Read(buf)
                    if err!=nil{
                            fmt.Println("Read Error:",err.Error());
                            return
                    }
                    //fmt.Println("data from client:",string(buf),"size:",size)                                                                                                      
                 var person Person
                 err=json.Unmarshal(buf[:size],&person)
                if err!=nil{
                            fmt.Println("Unmarshal Error:",err.Error());
                            return
                }
                fmt.Println("Person after Unmarshal:",person)
                person.Id+=2
               buf,err=json.Marshal(person)
               if err!=nil{
                            fmt.Println("Marshal Error:",err.Error());
                           return
            }
              conn.Write(buf)
             conn.Close()
             break
        }
    }
    func main(){
        fmt.Println("Starting the server...")
        listener,err:=net.Listen("tcp","0.0.0.0:50000")
        if err!=nil{
            fmt.Println("Listen Error:",err.Error())
                    return
        }
        for{
                    conn,err:=listener.Accept()
                    if err!=nil{
                            fmt.Println("Accept Error:",err.Error())
                            return
            }
            go doServerStuff(conn)
        }
    }
    通过关键字go即可完成并发的处理 ,go语言的哲学就是引入尽可能少的关键字和特性,编写最少的代码完成更多的功能,并且还提供了很好的工程管理和单元测试,一个go命令搞定一切,不需要任何类似Makefile或build.xml或pom.xml(maven使用的) 之类的项目文件。因此go语言的作者们认为,c++没什么好学的,值得学习的是c语言。
    上面的代码中需要注意的是:
    1.struct的变量名要大写
    2.收到 socket的包之后要进行json解码,需传入实际的数据长度,如json.Unmarshal(buf[:size],&person)

    Java代码:
    import java.net.*;
    import java.io.*;
    import net.sf.json.JSONObject;
    public class JSonTest {

        /**
         * @param args
         */
        private static Socket socket;
        private static BufferedReader in;
        private static PrintWriter out;
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            JSONObject jsonObj=new JSONObject();
            jsonObj.put("Name","liangyongs");
            jsonObj.put("Id", 31);
            String[] likes={"java","golang","clang"};
            jsonObj.put("Lks", likes);
            System.out.println("Object before sending to golang side:");
            System.out.println(jsonObj);
            try{
                socket=new Socket("127.0.0.1",50000);
                in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out=new PrintWriter(socket.getOutputStream(),true);
                out.println(jsonObj);
                String line=in.readLine();
                System.out.println("Object read from golang side:");
                jsonObj=JSONObject.fromObject(line);
                System.out.println(jsonObj.get("Id")); 
                socket.close();
            }
            catch(IOException e){
                System.out.println(e);
            }
        }
    }
    这样可以传递任意数据,即使go语言一方,不按照Java传递的数据格式定义结构体,也可以解析出部分能对应出的字段,方便而简单。
    go语言可以使用gdb调试,也可以直接嵌套C语言,所以不用担心支持go的库少,c语言可以搞定就行了,而且c的数据类型可以很容易的转换成go的数据类型,go也支持指针,支持goto,不久的将来可以在编译器级别支持多核编程。
    展开全文
  • Java是Internet时代最重要的语言之,具有安全、面向对象、跨平台、适合于单机和网络编程等诸多优点,其中内置了网络编程的支持是Java语言的独特之处和优势之。 本课程主要介绍Java程序设计的基础知识,讲解...
  • Java Web的数据库操作、JDBC技术1、JDBC简介JDBC是Java程序与...JDBC由组用Java语言编写的类和接口组成,它数据库的操作提供了基本方法,但由于数据库种类跟多且多有不同,所以数据库的细节操作由数据库厂商...
  • JDBC(Java DataBase Connectivity)是Java与数据库的接口规范,由Java 语言编写的类和接口组成,我们可以直接使用这些类和接口来访问数据库获取资源,不管你是什么数据库,只要JDBC提供的有接口,我就可以进行通信,...
  • Java Web的数据库操作 、JDBC技术 1、JDBC简介 ... JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过... JDBC由组用Java语言编写的类和接口组成,它数据库的操作提供了基本方法,但由于
  • Java Web的数据库操作 、JDBC技术 1、JDBC简介  JDBC是Java程序与数据库系统通信的标准API,它定义在JDK... JDBC由组用Java语言编写的类和接口组成,它数据库的操作提供了基本方法,但由于数据库种类跟多且
  • 、JDBC技术 1、JDBC简介 JDBC是Java程序与数据库系统通信的标准API,... JDBC由组用Java语言编写的类和接口组成,它数据库的操作提供了基本方法,但由于数据库种类跟多且多有不同,所以数据库的细节操作...
  • 程序:程序本身是静态的,我们开发程序,就是为了完成特定任务、用某种语言编写组指令的集合。 进程:进程来说,其就是程序装载入内存,开始运行的状态,是个动态的概念。而且,进程是资源分配的基本单位,...
  • 对Java语言的每个语法都提供了个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
  • Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。下面先网络编程的一些基础知识进行介绍,最后给出使用Java语言进行网络编程的实例。 二、计算机网络 计算...
  • 语言之间如何通信集成更是平常的工作。最近遇到的问题就时,有个系统服务是c++编写的,其中需要接收外部的消息然后存储到hbase集群中。 服务基本完成后,测试写入速度性能,居然每秒最多才500条,每掉数据也...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     使用Java语言编写款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
  • 对Java语言的每个语法都提供了个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
  • 对Java语言的每个语法都提供了个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
  • Java源自SUN公司,原先...Oak为Java前身,JAVA技术包括Java语言和Java Media APIS、Security APIS、Managements APIS、Java Applet、Java Servlet、JavaServer Page以及JDBC等。  Java“编写,到处运行”。Jav
  • Java种平台无关的编程语言,具有“编写、到处运行”的特点,所以非常适合网络编程。可以这样说,在网络编程方面没有任何一门语言Java更优秀。要学习Java网络编程,就必须要相关的网络知识有一定的了解,...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     使用Java语言编写款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     使用Java语言编写款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
  • Kweb是个库,您可以...由于Kweb是用Kotlin编写的,用户应该Kotlin和Java生态系统有一定的了解。 Kweb允许您将所有业务逻辑保留在服务器端,并通过高效的websocket与web浏览器进行通信。为了有效地处理异步性,...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     使用Java语言编写款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...
  • Java网络编程

    2019-10-08 16:12:17
    、概述 ... Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。下面先网络编程的一些基础知识进行介绍,最后给出使用Java语言进行网络编程的实例。 二、...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 379
精华内容 151
关键字:

java语言编写一对一通信

java 订阅