# p2p chat app with libp2p [support peer discovery using mdns]
This program demonstrates a simple p2p chat application. You will learn how to discover a peer in the network (using mdns), connect to it and open a chat stream. This example is heavily influenced by (and shamelessly copied from) `chat-with-rendezvous` example
## How to build this example?
```
go get -v -d ./...
go build
```
## Usage
Use two different terminal windows to run
```
./chat-with-mdns -port 6666
./chat-with-mdns -port 6668
```
## So how does it work?
1.**Configure a p2p host**
```go
ctx := context.Background()
// libp2p.New constructs a new libp2p Host.
// Other options can be added here.
host, err := libp2p.New()
```
[libp2p.New](https://godoc.org/github.com/libp2p/go-libp2p#New) is the constructor for libp2p node. It creates a host with given configuration.
2.**Set a default handler function for incoming connections.**
This function is called on the local peer when a remote peer initiate a connection and starts a stream with the local peer.
```handleStream``` is executed for each new stream incoming to the local peer. ```stream``` is used to exchange data between local and remote peer. This example uses non blocking functions for reading and writing from this stream.
```go
func handleStream(stream net.Stream) {
// Create a buffer stream for non blocking read and write.
register [Notifee interface](https://godoc.org/github.com/libp2p/go-libp2p/p2p/discovery#Notifee) with service so that we get notified about peer discovery